From 8b4ce4d893fa5ce9030d35db14773c9ca6f422dc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 14 Nov 2014 18:34:33 +0100 Subject: [PATCH] update the colvars module to the version 2014-11-13 --- doc/PDF/colvars-refman-lammps.pdf | Bin 629586 -> 629689 bytes lib/colvars/colvar.cpp | 66 +++++++++++++++++----------- lib/colvars/colvarbias_alb.cpp | 16 ++++++- lib/colvars/colvarbias_alb.h | 2 + lib/colvars/colvarmodule.cpp | 30 ++++++------- lib/colvars/colvarmodule.h | 2 +- lib/colvars/colvarproxy.h | 2 +- lib/colvars/colvarscript.cpp | 7 ++- lib/colvars/colvartypes.cpp | 5 ++- lib/colvars/colvartypes.h | 70 +++++++++++++++++++++++------- lib/colvars/colvarvalue.h | 20 ++++----- 11 files changed, 143 insertions(+), 77 deletions(-) diff --git a/doc/PDF/colvars-refman-lammps.pdf b/doc/PDF/colvars-refman-lammps.pdf index a9a1b5624b6054b01b24ccf4d3c20fd3bd9e1677..7a5817f6d72cb88e5ea6cdef565f223ca9ab6b79 100644 GIT binary patch delta 20602 zcmahw2{cyQ_o;|RBAO))GJf~oZ_JbzkwSb%^Xd07Xik6<#$!%@?f_(mpo z7-MgAt@=@Az&y}i{a$3o*o9ifs<#}&$Iq*>E0U)eM^OdEGM`gZax{~lx@#9+8|t<(%u;E6E$9K{vA{6)pt`HUlw{= zXXSs6+eOXwIjG3CuUr;7`#h(^*Yy6o4L8S|WVU~ttaemtQ~o|3-f`oy%;8TQwi+aT zFtnYrMBbrsqoQn(iEZe-fOSt&Ja^c4HKldF(;NLvs9{2*-jyrmhXWo>G&fEiqjhu6 zem}W~{MRe8{aT_GCdt%%@68uFJ?gMXUEdmbu7IaVOK5>#^q|W!9w^hQXPya_z-Ob;>TZ{sR$7p6= z4$+&rS8t{e{D#AC1pG$APZ)k8IeIfkP5Ur{%VN?|yirmkS!{wyXJw64;Cq^Tu0CR$ zKUYdze2&x{`$Y@)HX8@Yo%Rc!vR341lFmO<G>l=ql9Z^ zPW0w0CWdylw(BmG&l*-XW8DtBz`&paiOBHqv9Pt*S;ei{{_j&2W{I8mm;|SCJ+%Iz80u zcg(QG-ODJ?l=)-bi6bXlwLN#}B?YVy`W;+nAoab=V1?R*I(3EmHEMAOyMK$=FG}IB zd(2RtB{y4fw*2hTx0;7D>_z|iv1+Ng_Jk___KDxecLgTLE2zH`AY$5!pm?t@k)DQXTXv**kn zK3q32fPa3gnyS?PCAmL)XN>pq*ei5<_|y zl=kEZy?-2rmA$RZmWUG1buGO+;k&&`hwLvtt5SQ*M&I1rUdufnC-8QS(PZqJ*}6=E zqhH3~qn;;U{j0Ayh%XX zoYLJhnzip?o%;q?1wQSk;cY}a_)7itU48a3&n7)V0)3G8p9eM zw`=XB`2n?|1$+hFa-lQcDo#@T>uSA>Rn=KCNmhc_AD?j+aHne_ccla+0R)K1h%GHmfVvq0N-1}@^)Tb|nCHj`d zO5WqbCR-=S#M%>9M{8qp-KJmNl-T4|W)QpaT&mHUqPfb7A^fkMU%KmL-{hQs@VQ{d zlOs81>ft6H>2@)qGY>qQeYbL}I$;xQ`0#2+fwbn5%byi<>T;I#Jru z8WAN~kvfkmi!?8PIw92XQ*N=*KL(R!BeWa0&iK$MNB1eD1-n~$r+;@mbfQD8RH-(x z>xq12yltG;=C6`XcllQWb?W?g6?)F#Al zecANNZH+X;Kd^ktu60%#3+N*{UnX5CY17bpQF%MaRPu`2_ejFLDV-mDuG>vH&}f@+ zfRA0G(_vZL^H1I+u|`SENJ$&9<&3S}_LFWd+p2cPKD6!n#R!ysEZpEM+u|HQ*VMv+ zw_Rc%)Rd`Ac3;%`=O&<8umnw0AsOIjk#4 ztn^xjxv_SR&kYTaRpD*oadIt8F}(%a4Lh`Eo%LB<60UIA!~EUC#1~(#WS*Wb7e8hB zp$Dgoww>A`>Smc3cK5t_fy{-(M1xtKmoAREVL9dW?OHQ&^Pa7rm{~XWAHO`3&$o68 zo3lY~$+w=18w>WY%1=LiF8$KVhTTNOBC4lbwR)sVnp{SX>C*V)Rf>1@(~jEd&hF|i zKJ(f7AMM{Zvizf^QZmUZIcG%nG;ouyr{#q=w8l`asfzog3zj7%tG-IOxQdRidTj5~ zsy<=fli0GD?ioTWPE9P;bNV@UUdrD6{HHZFg;ZPJ+!~p^{*!VhPSd;^DkFVX@^xwH z`gQf&t|)rU5%O_)trD=f(&V*r%U)Z{!!MtAR=8KqUp~$zt~--9nW~Ua=4!to6peCa z3&OQ67bxFfe8OSboO{omE@=O5$`^l5{Bu(M*-d+q%y;dJnlC*wP0qie6nc>tTE974 zk{_G@BO^sW<$IYi-?(;e9s&DrPb8lDt--#B+n&F6T+K@FcrM1{;F zbCpW>qMJK+J~Z=cbIG0k!P9I;&xdh6saH#aWH-;=@$HP`h_Uwe$NUXFXxnnH#*+_w zD~_MC6uBJ`t>#R*hxzAa#gm;1dg6!jzvO;=#jn0)cj|glQ+gxmW_+gV@<(~yOvNxg zooRFL_ANWf{ahTU9yfo6q)hO&jjopAa}~;2!pFu_)%S`YA8D7}G3Dr%%wHa=zh0Im z)v`llwyTz23YR?Bx_IwZ11;%AV;{7@hMVKIHds!!j=OE}Wcz%Z@N-_x&lsDE_EnE~ z$g?tSb9Vid zw?8`Jv%X4Oug27hCUPSfGbJY?tki4O0_u6e`V zjuLg(h`U1V3%+I?QyNy_?XlX-rTC6R>O{$3yGw@iOm<7mJAX>k^>}Jw+`6i-j=drk zZ6?Hs5n5k7Zz$QvZq1paUaPb&+Un_qyS3(xBRaWPev~~~ekX}fHr6{Y$gbHwi8vBB z_U()Hc5By3S$r`lF}&m%lCpGUtC4H+=bcOAeWxc(Ea~}W>G$l7Y0a2LKYGW=RanoO zy~h8W{w7oA{H`#|)c4Nub=M!T)}<$pNIyTV`m&^juyaNq&%I0axzl*3+M<%ZQhxGR zOpLGQH13r?6`;`OS`@0pR}~&{vP)k+X~VshiJ!kl`ah4}DYiMwDe3dhcj-NZ=5;8aeR#X;7jIm(O|yQo zv3=L@&=UENSFd(IQ$1)^%06{OW1?l~lB?4WTR(mK_S(#oHU7_pTQe08y6_Jk(TgOM zD-}j8XqqIxcKs^Xo1P*%2IW~7%MCkAvO}uH838XRx#@R3jFn=!-;gV7nz82ARZisA zxR|PUCtmg>)HuXPdkXYl?!M6UbIJMYVtaZmYU~g zCONYHj&8F%8rh%xPn$_;G;ICUTUg|!d6dJr`ugD2?$xU`?f1Ss^ql=GFnje$SC{36 zJKQ5Z+a4}8{&`$sLWAbks7iMG?io8G_Kcsco*q$tLr5)J&1b#NjGoZ!ZMpxs zX_NMk%{w-kTUl?|ye+om_xZ{d`L)Mo~*DW|5 zr)${u$oaKq^r{jiqh2Yi;~sepcTTTd5Hi^>RE(c@ec8J2BjsG)o-HoCe=)vy{XY~> zCEu}3`KS}=Fjp?&*UN|*zTV*hX3}G(O;LN87jA2Fee?cc>4jTK4f@J99E<1`Q}E#POYe2+Zq;jm3M6tS^U*=rP%4I zJd61SnGzE&^8Jeqp5`8}Jz*DJe`(9(zVQ!Wi<%d>W_{W^`jGC;5u3g9vZwI58&WR~57e>w<}spq zo%Q0KoRgMOqRq`4izc?jUUd2O%WF;KhTgg9#J5iwccPs#N9n&S*W0X~9A;h}bYGpc zJl!yHlmEUtDQhUZ} z9jWfLw8`0>pW62CsJh7abf|0W`M65@4keQAe&H3%yyM1-qT=}mY5UT2VqZR)UTyTC zCWW`HwQbcK$L*bV%N6VjD*LK-JTo+*WV`R$_?0S#^}Uxry;1AB3TfrlMoPZPkxoYE=l}cXZTweLi8h8DMEoRi+<~--a<9~Uq&w60!mKe4^#c-j=$us<{!yZq*xRff? zf0{EEEZkXp!S$PEiRQL4XAf83H}BOG z;f*|-DS5!t%3MS(VRBba=PKi;Idh^7M1E*mmS!)LabLge$I`P)4BS;444Up2J!+ep z`CW@Xde^CW_wln+D~v99_msWl*S5UfGgtf3=75y4vSCy2XJs$S-`x=NV)=m@$D9uK z^4INStL07PbUt{u^ITt@IH{zacs?RJ=0LCCY|GeLs?<^9w_HopKTG=VhNt@Xo{Ddj z-z7ul^Ivx~N7#2t?)vm{*P^4753`r?)`*TUS~c7_tT-)bzVM;I{1dX7k8G_J_4BWc zedbzOp_}k~;m+ir##fA1qd?)#Z-It$pWixCFZuuYAR9T=k!CP8_dnh%1+^ji)3th|t z8};~Kn?n*7JE+@acD5TO$;) zW+bXehv|+_Z&By3K1R#b)twu@#3tHf^sD*GW_zxFDSea|VESrG_jzY8>o0kZT6b=p zo56Q)PkWf$u;>hf{N!=vfRV%9SO2VtsaR>**3})p!t|TP<?%&d1N_Z7LHMOW(e=oqPsnBB;4@xJ~1^eCryx6RC2pWC>+eW0Ie@%Yt%eF^U+HliuTGC9WrMnRIaI3z1I9t|G~;@pO)ESHB0N* z>IvU+_sU(G7MUQnhjZN^^wtX^X8!fq$Ckz6N14S^?<&OZpVba*J8?Wt?R}cU=ZrUT z7ZOW%ZeHspJTuVFIHN#w)CR3J4m!2B-aWIv6=EKG(mc-Flnlu0jnqwG>S}CrzFxO8Hh0DHq&_Y6vwJIf(>2yN`Gh;Ih`hS1 zw2ovO8@O&CcD7S~ltto#^);?*S`_#-QWCokyL+o@nOs`tpM0^&wmk4!a={{t6*lpg zZ&&&6TN+-(?$MVS!&P>OI+yli>Ejgl@Iyym%e=O292t@I-ctMP-m?7L7Be!oNc;9B zNWa!TF)rlD^X=^h`S&EL^8v10qj`z*Op85z=cdkxRCF*qblj;cE2^$O@8XrL&04Db zM|#aueyygCnJ*5>-*)82u{#OF)RJY2KHXDvv+};(bNH#QOA}ljoq0CV+awJcNxpI~xABa1 z&Xqh(PPTKF|2bDr&9?ctTuA%!aUTm?oo}spXfi-o6hd_*|uG$mGdsA+Q_99 zZlEn5tIn-XUcIs4<-(~^FFmG(e3MzeG>k#Gj382#B!;bVdo^*4jkfkQ1HNsZNuI3B z*~T&Lqxtjld`?^nUg6PurcR9C5>e-H?Dd%>m0QNePc+Fdv3D9)O}D>ksjM|?)Y49c zd(o2hM`~xbT`eg&QaSPJvL%|==BW5yV?C%8eIy0Mgw=P>XZ~AvnN}DOXv#6xFdvQ$1h|=Q+D(a6(O)KO2tvuQ*`pm*8dlcFwp*i>2&(H)J?e z$DbIPF0OS#Eq-DTzju<{vP(RaS!bWPFH=dP^xn?ln=(%la%?bZ{^MzCcgTz z@bDe8WuwIXo&-RMTYM%&b97R@?!_xVE=d~SX`U7GwE6Cy%AoKP=aCvd+lXkoyuEf53Z=Kq5wT0ocW5O1u z%KgBiO>5Yz^yAhKt7`kP`F!G+$t68<Vrgu+QqP9=nJRix$e5loO_V!&qq~!nnuqsxHLo0tX`)lR#s6KSWW32`t>+GN z$8EIuWUhx3MhpIBGblEj zN7tE(sZZiypIA&TO_+%-lxC6GHztQo2MNA$3G5riW6%|5fD%8AVlZhrbHO$SwvD6+ z+Rc1ON(csrF8tp%3fsn@C|Y8r03}8x$z!rn9tlF8%I-vryZOzbo!LDD*w0+bj}NQz|9QIn8~g2m<164rui{H{7+e;cj@CmybgW|DixivrsE^LOt6y4Sgc^C;ASt$5~@t8qS zOj^PYFmiB)FaV>Y;2VV~GKxRV0B003Nvr1h}p1s94?1PM>z?OLp%wC!Qpbj+ML8Bg?My_lh}Md zvYTMAxg^Fd7Qw?*ibbJ*ip68I7#KbtlY#6d7@&@SC}a0WUI20!hzS9V%R(4U5DW%b zW5otBNk0CGLd^n}Gf~R~7@NfRa!_rBbwK=JnGgctAO6@4&`uC!|AqboV`BFq2(Uv8 zAqRBt6SU*cP5FOWLUDK)Kf$6f+L^#8^bjV=!C1#+qOOi0m~4bVH3k4VY>W#` z9_lgRR0a<$brbL%JDNWpIrtqAP@n;LI$n`z$FABL2$SfrYsx?D0I~3q1eQwFms1oiH(Vv z%Z310CqRKv2D;BAW^BAHwQ60AZ%fvGXcBrryjpo|!~OkTeW=%)-c5u}SA&w`?BFbuSl z&HbY?|50O#$3=L@;!#{Cavv5CTm=Gy`>)EKQ0vHFoD~ruwKvB0HS0^BiL`z3N!DAw91=V4ri3t># zP-`J^f4Hhf-IPD9pYM`=x9DcvPlNU zEjCH;&?~S>s^5wCTMq1n8W14~7{dBP(%)-A+y$RjA)pCcPq5H@23W&J%WOCcaxwHQ z;0Z=23*0BV4mkJc+=0MPve^`cI9LJcn4H)YiAD<8OOl8#KiMB{`rA2nujW;B^sx zav<+O`3`{$b%cNqS|k7N9q^bWhee`F10IuuMrd%iVB&)h27BXRN(gZRCOJ)az#UPM zaKOY-kICUcQa>0i$>DKuUVxCWJ8~e?#P$y4b~Xcs0SN~iWg3^FFh%E*(9OXRLSBKu zxOCKEF)2RD<)BxD1{ni833^NWyyvo8y5-<0rD2 zh%LcUP)-g$3Iq*~4TFJC9t@+PChAYH24W1PoB}_P4K$&l6RJb#h#@#2BB0C#6bxwG z2<;q#Gf)Ab@&RR|(E0~R6SVV81t?HP5+oFT2o(TB9R;8zxCEUvBnmbM4HMAeVe~U& zK%1b@=0bJ^DA0H-czqZG1rv1`u#VZ^Q}~M(5=+F1z&bYSu0W2Q{(5&H-oio-n(l!W zgXcw90>ulOQc{9c9u*+ODh6V{6af|KU>2(}C}1(_@d3u|FHr_=M}qL#G~o-PL-4|d zpcjGC3Aqo-45(zFsT?FgfiLG^k|w!KG-gr|ZkZgqVn`HR64OCwhafiw8;0VRqUHRC zkUqF=G?{_rkR2nJ15P4|3!r6kF?FY)p@Z#Z4YUvbS|n)_kk=19M-?E0h$Cr=*m0#<6aDE3#`iq(Hp|nV7vgsnrr}L zqDdscpap~Ng>>Ry*g(91g%AkQg#-hw6CncxwZ_&#ZybYhxlp?W4B?L`NW1XmEVL^F zNB!^33{ap67JR}@3tCbnf)?7p(6t;)853R-8OTiqFjT_<21)F{dk36}0ElL66caLk z1Rmiy)N$47uOfvzH&Wm8NJRPBK*2>T zE`agSR1DBE;2DkJ55;#51PSy+4wfxI&d0>ivLMyK*u-J>m;D3o5c0)-nGKi>1+JM% z&=mrj&}*?k#ZmKMQ7kmb1B8j0HtfVW2z4|TY@lZD4_^PFi35oz?Y0Z|+i(_^OH+UY zjYFVLkl53OfCBYS@Ch2a2&)-;YSH7Sd3~mST}YE7xfhaZlMwc7#nSQQlMHSNq-9lA)wwC z#E5xd4hR?F55<9qi|vID70NSkB20W8i~JKJ{wf9sY5?eThYXQqK(D;tJ_hUx2QO4enFVJ+ZvW>Dxj#cj6!gWh!~pePKkjKiSy@b9|+h!}cskVyeeXax*q5gW}i z0LH=MF!Z2dl2GCRpuiXjZ$>x_(ma%0ct?VH837863*e+ME(n^8aK=}^A3zLQ5ff!#0GNW}Oa0kqUIT%b91axZ<2EjTk zus}|Qy~qO$-aZF27hnTpFar)4fCB?S16Bv#15K)79T$yMf?^zPjR1^*=NsZ6unF}M z(4Ir%6fB2i0;Ln)j5&0W00pYX;7HN*3!0n++Oh)})RuGwpul_tw6%vo0S~|^6`-I< z7=Q)`45gs!Ag@F92ZnX}leNEU45WgcN61XaxH;FTI*2RFg?l3<=FK0&?w2iBhhLqiaI&xULsrX*;cXiyW( zjN#c5l>(&JXoD5dvN3aqIS)*#&^<JkAg%VirK+1a2G=;I=lt^;m?2g4#fog`NI*Q3B^HyVW9jJ z^yX3h5WK&j>!9F9(|nkJ#tKj<_+WD2U)ulD#Da1F+*r&Id;(vBxgw}nF{9={w-Tj^ zD;Rx6_ym~?rZZeFa2}-zCZib)IvZ%hyfaKoAx%}VS2zrn69b;h8MII=Tno__cwOM4 zZEh9;4~Iwz0x&4z2VX%jLe)=hzb6J5g+^YMK<)pCc)&XY5Slp%LP)_;*UkdDqi?>@ zNrp#sbgv+cqA=(v4Aw0^0|sQUxeOR`g7A%Oh5*NW$JPCC@5sOr0zdV9qy7POW=RHOPE@- lH2&WuYi4O_jo#tm=Vv;iS4!tQHqnEz@sjT|s;(p6U*cZJGI38PfqGu1y#5L1z zI!8{opQ9kmHg&zikOrww$C~VT8OAPi+&s`lN#5hqM9(m$K&{WTPm7w;wC{X6YqDwR zrjZL&t&4284UKSh?Dz5LHH$|};;Si8|O zW9^Wb!Sd#IE;XU~;Q^`Fdylwm8S*q+wQWP)p(zihOW07Dgl4p z;ZG9&q~K2){(9tD4V4-4Qj(?wVpF!Kk|aqA#B;r+_1Iv$V7EJuI(pPQn)Q{M+{=DJ z(8gL_S*$p6j|11U59iLYkgDo!UK_J3x7#e^kX5G#b<@%wtvzzI^zcJhw0F!$-5+tjZcUEIuwHmml;vTuVMc}=|0tJWrONFLNvy|tlz zq1VLI(|amPeEwnVR#vJk*Vmzld+`mA!?>E0^4XZkC9$A06 zP<3~=q6;}5dfFo8hy0zBb)76^asT~AG-=h|>nwQQZ@xZZMm`iwLivgL*YW3pD-st9g-(#s>ZQRXo+B=fv?!5~<@36phueF)#fRa4}G@sQE&w8k3R&=#F z`NJA-t@ccdjJ>HQjfNSuwW(Fctv=JLw%)$q6dE$WY4Jd{ln*uecS?Mf)_KZ4H=#<7 zC&iO)~6be3SRls!MU~d##kS24tFzR8z{G%0)x@ zi3I;)Y;17$ZAwODZ<;DzATElt1 znRRLFH$&BM;rRS>@ zEOJ(pi#fA)zlYlqHnc4Cj?cblPC5s5_PpCZBv4I9?{kTpi_f}4;f^LvC+LM`qgxfv zoqRrAaC-2DQOk$c?TI?%^7)S7*!&w-N%uD7h$D2fw&t9+^SU7=zsNAgIwq^&RBCbb zFy6!5>bxFXW$Op3Eo+NCJ~}ng;)X`>u^~RvLUzG|%?%pG2Q~)JiDwgX4qUt+lzyh5 zp|`d>&ol&hqcZcyLkDH+vlcN>}|iy8>iIs%r)V|kl-X+ zhv){M^ePYYbxMqQm7bPBdxxjKxt)h!kjB?G;i{BX#D){EW2oe%&m0w-WfSV;w#=I)?^;_Wk1asB|ds?d2K>Khppui zr!CLV7d~nm=AM$9IQeki#TjP86Ka!+HarTWclOpB`B0bHC7<#1dZ9VBYv>OBbs8VH zuO7H1VSC!$+=o3xdKHsn0(dL?8f0X#R!{x>)gp37xvl*^cao>WkJ>&L?k!Zk4IYYW)=G#k0b4pGBS8uJ}d3_>7QWb zwg1p^W9zy`yBGDEd1@Wyb7W>a9gNyCz*7E*&BgVHQyZp=t;z6&9(~4D28pv=4?O$v z;Arrj`RYk$JP#MP59+2-=HOnClN_YXuCvYU_}aotYrS*3r7nF)Mno=CS(>$WVsVw@ zo%WCMauHLl8Ut6Ic=@Eb+H_Na_wmVlyaVPRIvBn^%rDiZw+XNHf$sLxA&*`hSXh^8 zYWgi*C$uhJFhkn3ILq<5VxghklP|X<~ft2Hy5Ra#(YgqG3Y3%A5>vC_+8V!{I6>5*On_ux}UihZR?`;Id?$IzU*P+)>S|M z5Zls2{(PdZ$x9cL;bcNusM8YpCyGwDj<0y2UAFPgJCBLZ`V~qi(pF?#@in^VFxT|c z+?pwGELVKnWmevHVxDZ?YCq@di!;AjSQYT%$2+m{?fE<0`-DBL_5WhON2}v*cGO;t zkLzsZ0?Qr!W6N$60aG=6j9*2~db?&^-2BHoH3v%MXL~+a={{ug%gekDQDWrrjc+RT z8k)x(QH+pEcXp5S9$?`1CPu-3TdC5LCZ}&-?W4c!a!*)wyZoZo%oIPmwWxe%$?Pi* zCw-&4#jVLaF^UHJ`$(wmy1xbNQ4j+jkkh z?W5{NpKsFjKelOMzxBIHsQovlSj{6ItlJlypDO>(&_ceYQHQ;hx8u&4H}(4tt1gdU zIQ{w1X=5H8c2Dl{qwbL?>L0XtbKQXD=%{3xyUho(G!!$FHCqbIPVUz_m)s&)I8gr$&Vb3 zm#DZMc~GS^;^2@=D%Ee=!&ql$NtZh<`jc*?7$;h8RIu?$8a3Et>>?vIzUmO{u-3RkVTPNU5t#ZoHXE%tYPcm+CUTFRu|l*~&hPb?Rq* zXsbf{ehK$^X#q>ERZ3QEm*^1AnB);Z?2Dy$UjOa8=HAbAaktWPJ+5J`__|P3H#s`P zXr8cQW)6DhB~dbbTX5ZdzuWtrbe3H|6eJnxSbW}f)W>%jII?C?ofzG`gbOHR*CzV`Pm7Z_EByCv)SOzyZ$$Lobz7)Fq}BuUKL2 zt-Ex1{>clk=aekjm-1j-g-lE6z)x&T#hn*ZJbBe=DqFT+9;dvZ~r$Zy?cBUQgG&s1ifdvq{mEKzBDe>Z!?XV*%#z78R6`&OnnPECH7c&2u$e@IrkW?+JU-FcI}p{74DsOQxNXFODc`+!POlJ$PyTWL?E3?nEtZ+V>TF~G1hr+gSGHJ>7;`i& z!=T~HrZ0WIw{F_M?3wBpxxGFqhmDnt(>?_1$I2xhuk&-Yi~M~1`od%nsT&T{FKv2k ztJ0!jXr6g3@_dnKr+J_5hVAw#%IhPZ_Bk@Y%2c&L-StVm|BX3x^M=VwlgGZM_C-V( zMXw%4v^^eMkd^ph!Tu^%G|kp;UE=H_10@yHSFi4rM(oUMKXW(v!#r>H+@1s{Z>2GT z+J+j@V^^)Qjl6bZn_d59d%n1hH|1XxeXg}Qx80D+^?4lXq0{s-IJn0wl?g?kk6-;3 zm#CDI78hP=y;w0g3zBk+ejgvJ>}`^nRQ~nQmDhR$tVf&d5B)@F=2br_fzO z`F>EsW$8*ghjF1#iOC0!Z`@QoSZ?WA{ajC-6Qe8ChJMYKyV{(%=H^gQX-4mB=2uqn?%BOYdc=+`u{!bwmP%V*)hc>7XBymEPpmdf z-k*6=(s*cr^0S>omh4+|;MGN|mhU~DI5oUxLPAvv8XS(TQS5&>pA8Yy6TQ;wuh|Wo zdRu?#1sM(5>q*`H51yEsqnc(R88u?y`zzTN5$^L2^M|gEj4H9od}DCoeZyX(hDUPj zk(|b~t09q@V^TIPd?wnpdyji3r3d_{1&Jmkx%q?)+WvXgC zP2bgVL`~}S15Nr)#bc{mmrlL zZ{BO=`0Td+mdftqWfCqmJa;K-DdUUGo|JjBrK&1Xd3opJL+0mYo_kNx(~I1 zYVv#O5h;G36Q_7QYc+qo{lxWS=@w67&$&ALJCswc2Xs=Dw0yT@KD~Y_Y4e)Ynzh&O zmZscnCfoatsCguxUTweYNSkBE+_HozuS%G}#ifojyUTld9xS_AGG#%~r{!_%m!zY< zdFCzY?8z0YTqeGMwpf_v*yl&1!3|>4wG=7oXzNOo0v%$`^0zxwgRaF!$f_UxYJ7Ts z+B#bssRN6o)u47Lw*>b)R*a zCLdh?e1(s+o623coqJ~VS>8KparCy3(Icnn#_NW^ znzH0fkF2$U)gPRgIK#cQVLkeU_1oY&#=P-B^*r^YE%z5+I-g33#?61mJTG`ImXT`? zR(aVh^=X<#rd_mR#`&s(TN5G@>26D22&+p!Tn-N@sfb+`b>{O_$*i4avwF)t>26iM zvdzUPHO=6-cg*#%L9>cIO-n7`u!B9my=}keN-IoT`anYT?PLDqNRLM~4ZM(suLm?I z7%C_S)sHVu^rAn%e4%e#ztYp{tjgtz;kFm6GisS}25(A_v#Ez)ZF{NMShv(8MJHf& zDeu+pwMSKrZEyO=$P7_!yW(>%J%YD*igb*tWvk;Nx$BM1d&chabzFF&u~M!L?9W1S zNbmTXd1gM2#`nvJ@n-418x?maAIy%ccb(_|Xv8bmLw!d1>pk3_m%OVwYx`)#Hur|tWX*j%;|xK!oLV80a12~Mv|{90l^q)I&QVf_ zoWIYqkeZ{z*o=EzGWb=W+R~!=TSpCzC}yYIJ=(Zf!g*8r@kwWm?dM+)e-Z4yPkFv( z6X_Pjma9kDKGWBoWK}w+Jak|4h)*+K2p)u~t=zcw@u`=uj>d$hRV=-?TsTa6aK?1= zuvC@2B`=nhWymN-DW4Bhm{8R;qjkN-fB{2gA04z_GtuAb{IF?{&fTbWJvr_{oX?v; zGJkUGVXQtBph#l0qg*t)i=@FW74vOKT z!y@sZL67;9*R`I#Uzgh8k-m$!qoXkMvF450dCRCV(;@>t^)H*Kc*to~=~imR<+B^6 z_1%8&#_I7u#K2 z#>`uB(7)-*@_6-xvysE+SW7mwz3?9$ZL-;Eh-0fL<&)pu)SC+mt3Rq8Zad#1Rk-5D zzNhM+B+l;9PfD!M&`x~%=-q--tDMlf{5(u)ch7MREoK^N2B&AQD1BOcv;Sq+(24d@>pdgF`|(9>G2yxM{asxy=7m&=UMq*Q^0SgJE$v}5S-pPA-BU7Cs&9ufk_%pF97+jT9J#^k z$JNtWl`j=n6dk+TK3Z*B;=byD&zI<{76&Q|l}8=eqwb%STYjnO^{J9tNz=>}(=DkV zW1cjdJAXNtH?aR!OTy;G=n0J>dgDh+FJ^55lNx24oBakit0uhLI@Eu&Vs-D>5>~hN z!Or$IHI?hGhU|B^nNn|2Vsj)|h1Bt!T$VRZ_o=s<)WY`(f%9vWdiRP=U8#QTGe15; zp|Dwv>htnhbnn&cbX=xC6qHWU;@Lbtzli7kJ(D~vy<4f-`MKGPsjm*5Y;<02dhc3b zT#$Lg^(i~EJ})?#dS%zPlZzAMR!VNV+uFh&db+*nqQ&_vw+E5Zy(PkrY_VEvxFkd- zG%fDU-ud0ftn*PF9`r6n{pw)CYkz=8*wArtqM8qrj?a9Z`C*FR>}AuRET3qi-<;Ea zO=e*ptvSmrzTdU58hVXo;*e_TF#qI35{i{|dg4+r;5lb9wBAJUVN8XXi8kXJCI z=ismZea(BUEIZ41G*2K9@c9BEF_I_H;qi3z4*mHJqf)>SLh)7Z8-uT- zNlHA(0gmHiTT+xr?ECLeq=*!sc7Pp8?A`)`=81bc{_6q)p@ zL5VkTpD;rB6e$u{Im3>)n(#?lAl7w(WtdEXd{P|h!d)9Dgk#rLZW&I9kVlFK&HN`J z0=`h}I}>)~VbTUe;fqgm%P^e;D-nr%y23I(CL5keNQ<4hZ$fNK9s}l)?fS2~@n}*g zZsV2__?8sK7hAaf>ux*}^e&nEBt-eoBWMsC_X%SpPY8@;X2B=yYH%~5c*8890~a=r zGsP-y8GaZaG*Wjqe8Pmy;|clV(Alsfg)oE^iA1pDRqmSrQDpeWfFciahi^QDBk+v| z0r#lwQ-*ijf78p0Z7dg zcBC*qGCYDW?&&2f8c2w+<7g51G-t1W?MX8r(QNJ$;u1&^P1BUP%}druAN7Ph9?hUK z;qxelCd6*uvO0>$R`5w|x>B}3OY+co0d8MFVwa%^9-?|+IpDjxS}(vz)HMQ(5+N1@ zFoxv#%yx>TDmivxbt~{C=wzP;&VVmw*Ur# z54ka)FT`%g=aWBg*X4428ubUTAInhK!2$?r=ph0=jp!bi4+&7V0(~Mx>j94<@wE*9 zr$)g2esq^rzuUqAwHPyz`)#(t;` z(Zrf_gsAU_l!1qGdLSGE(WL7kT;U_(3BggwpyDSXOC~UMf=?qbxDQDnj0F9HLaggi zfF~3p%oUIjDmXmOIsVp9K%}tXD4-!}?7AV`NBD=kf0;|5Q67Wp0~HG)S#dWUd<6Dk_L1tbaQAZtmI<)gVgAPP}`126&=6Tm3cNdk<< zxIjXrKq9&Tw)>^qaQ{E-C&6;j+reVgsez7>sNM-knnv{#VBnb08#BBvL6qY^jlpfG8p`Vi+MB2!UwgA9xI^GeYoNB)T8X z|Ks%j1V;gc4@`q;Sd97rN(3bbauZs>Lx}-T$Y4qhq#zE?o(B$-&!C5Zu3{_%Qc&dr zR}J-9S7Ls8c6adXz#+tOLiFNe4v~h+1;YcgM?C=zxjjZEWYfs;0;X}u_QtO0RvNe2D%@p260&!s`iW!x@=up!pVZ>?#OwYKQuvFfrefI z1DPzUEs*`8JO(@l4bcKd1m#NCg9Qu(hfa*-&gTgr%Att`ATrn?+go4f*{PT7c77hWAKz#rQL)tqmu!h3QE`WhY>UtB9JCEDN7@UeZP7cOkctZBCp8Qu-3Wd<`M+`#< z8jE^efMHEjfDssH2yQ0Sl|aCwe-)%~|3B;}ph1Vadl&$t;YQg-#BUh5`wr8j5*To-jVaOpFFrqh=39Kjt2waPL~3at;y7EzncWvHsOo2Ixk$ z8oC4cO}Iw|*jf^8o^c|<@)d>>QEX>r00M*z4XtN%Ll7QnI#3Y)S8)9$8j5+$vop}o zL=_XX=r^bTRtu2up_2oE5M8tt2m~uZhc6IBp{PK_#KACMA%dx3S8k1m5`~BLj^SV$ z9mohpFposV1aA#ytOqX+0Rv?k4Bk+hpuWXZ9uaguv2CG|j>E7afe>W>v)9B~@gGOW zsVpj07@6SAfKDz(GzBwUMEcNmB~arN!F#h#u+eZnFcOjiOiiHD!CBT01C1?A(%{9gi-3Y77XgpMVulVt0U8JZ2By^Y zV1PklhrzJn1K?qykKn=UwV!L@{=an=fRIC@8^WUnM4o_0pfw=CD710{7*?wStm}N7 z<3AKNzfuTp5QWLivL!4Kz)07=aZl@Q4RZgWwE!V%V8L;6DIGXoCalN9@4^ zz+mRyc`>&Z948KgDq`Wvv80sF@gMW`o+*HZAB3B`j{5{H3L!tn6fF&M;ePX7sg za0v4o_}e1D4a4NF>xM!Y4xp_cSlh)Db3O%NU78NRV9am1|5kLa7a+pgfB?gbPbk=M zdBTfD%r8Kk=^|r}81Owf48)E!%AoYe!=8-+40}8WFi5t#u4MrTuVlIc0fs#Rf(8g5O(g(^ z+oe~t9OfdAq_%NpYX1zl@&Ewpklv+MFWhyD3`3UC%! z{meDF(Dn(z=bl8MhX7+RF~L)2lt7p^VAdpHp`nN);%=0CM1|gtYnJ0M<{x-iZcjiT z?Ptq}UKWGVnZ(=hQb^Oz%UuZ$N){Nff#5(phUyK1`{z@=TAk4`~PJ> zOal>lLZJt(LUcpuxuFUN!5D265dcG5Bme`)+-X0K{{X~BMeyJNUU+pv{DlWU%t2vL zRH42CrUIP{BUlP&z++8}Gmw8^<^(Tha8@&rxOP1l96C0^C!qO?TZ9OE0ZxFL|JO+D zl>fn`6z%&$rpKTiC1^|H(GENXT9^=Ae$|=P92dZQcP&DI|L~g!coWd|b_6{6!U7Bh zeN~i&@b;(chOi%W`!Oy6uds^%qbU}p5MIq;%Edq@5%u%%um&?(7`9+V2-JmW=Nuj- z|9Ou7C;tN=)=vdp#a>+lj6tU!B>ZL$ZR`LHdP-fn3U3k7NiNF+AhaY9M9y?@m=GQL z!pk)t`t}E4*d!Mo`u!Tcfe!pOcM=+2LiEiljN7r&8erHA0Gf(v6vVCTNd=P2FoE+;u0Srby*f!XZ76wh?xh~M# zfj0sOtGF2yDi45>XrciyD2LFaz-eLoLCX~p8$7N3HR|Ae`)_RnAVdvxLmIkI7z`Vk z!b@X#k%{8L%N)cR0bZ9!soeSSQ&q^UFhqzh*zG{cF+C8$5Cc6JCWts5xGfCN4tvqc z)v?%3z=To14|v!cbAZ9`J;Z}{$ePaKPa??)6k|pb5V9d@V$3G+&EU-+F^LhFnhEH! l>L&jeWtRHbv2sg;<}L{eUE<{}2iwDwc)1ZHCQh3q_dh|)a>D=s diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index e046a0bb12..132793ab2e 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -161,11 +161,33 @@ colvar::colvar(std::string const &conf) enable(task_scripted); cvm::log("This colvar uses scripted function \"" + scripted_function + "\"."); - // Only accept scalar scripted colvars - // might accept other types when the infrastructure is in place - // for derivatives of vectors wrt vectors - x.type(colvarvalue::type_scalar); - x_reported.type(x); + std::string type_str; + get_keyval(conf, "scriptedFunctionType", type_str, "scalar"); + + x.type(colvarvalue::type_notset); + int t; + for (t = 0; t < colvarvalue::type_all; t++) { + if (type_str == colvarvalue::type_keyword(colvarvalue::Type(t))) { + x.type(colvarvalue::Type(t)); + break; + } + } + if (x.type() == colvarvalue::type_notset) { + cvm::error("Could not parse scripted colvar type."); + return; + } + x_reported.type (x.type()); + cvm::log(std::string("Expecting colvar value of type ") + + colvarvalue::type_desc(x.type())); + + if (x.type() == colvarvalue::type_vector) { + int size; + if (!get_keyval(conf, "scriptedFunctionVectorSize", size)) { + cvm::error("Error: no size specified for vector scripted function."); + return; + } + x.vector1d_value.resize(size); + } // Sort array of cvcs based on values of componentExp std::vector temp_vec; @@ -190,15 +212,6 @@ colvar::colvar(std::string const &conf) sorted_cvc_values.push_back(&(cvcs[j]->value())); } - // // these two are the vector value and the Jacobian matrix of the scripted function, respectively - // x_cvc.type(type_vector); - // dx_cvc.type(type_matrix); // TODO: not implemented yet - // for (j = 0; j < cvcs.size(); j++) { - // x_cvc.add_elem(cvcs[j]->value()); - // dx_cvc.add_elem(cvcs[j]->value()); - // } - - b_homogeneous = false; // Scripted functions are deemed non-periodic b_periodic = false; @@ -1176,25 +1189,28 @@ void colvar::communicate_forces() cvm::log("Communicating forces from colvar \""+this->name+"\".\n"); if (tasks[task_scripted]) { - std::vector func_grads(cvcs.size()); + std::vector > func_grads; + for (i = 0; i < cvcs.size(); i++) { + func_grads.push_back(cvm::matrix2d (x.size(), + cvcs[i]->value().size())); + } int res = cvm::proxy->run_colvar_gradient_callback(scripted_function, sorted_cvc_values, func_grads); - if (res == COLVARS_NOT_IMPLEMENTED) { - cvm::error("Colvar gradient scripts are not implemented."); - return; - } if (res != COLVARS_OK) { - cvm::error("Error running colvar gradient script"); + if (res == COLVARS_NOT_IMPLEMENTED) { + cvm::error("Colvar gradient scripts are not implemented."); + } else { + cvm::error("Error running colvar gradient script"); + } return; } for (i = 0; i < cvcs.size(); i++) { cvm::increase_depth(); - // Force is scalar times colvarvalue (scalar or vector) - // Note: this can only handle scalar colvars (scalar values of f) - // A non-scalar colvar would need the gradient to be expressed - // as an order-2 tensor - (cvcs[i])->apply_force(f.real_value * func_grads[i]); + // cvc force is colvar force times colvar/cvc Jacobian + // (vector-matrix product) + (cvcs[i])->apply_force(colvarvalue(f.as_vector() * func_grads[i], + cvcs[i]->value().type())); cvm::decrease_depth(); } } else if (x.type() == colvarvalue::type_scalar) { diff --git a/lib/colvars/colvarbias_alb.cpp b/lib/colvars/colvarbias_alb.cpp index 309a089258..78d7341af9 100644 --- a/lib/colvars/colvarbias_alb.cpp +++ b/lib/colvars/colvarbias_alb.cpp @@ -1,8 +1,20 @@ +// -*- c++ -*- + +#include +#include +#include + #include "colvarmodule.h" #include "colvarbias_alb.h" #include "colvarbias.h" -#include -#include + +#ifdef _MSC_VER +#if _MSC_VER <= 1700 +#define copysign(A,B) _copysign(A,B) +double fmax(double A, double B) { return ( A > B ? A : B ); } +double fmin(double A, double B) { return ( A < B ? A : B ); } +#endif +#endif /* Note about nomenclature. Force constant is called a coupling * constant here to emphasize its changing in the code. Outwards, diff --git a/lib/colvars/colvarbias_alb.h b/lib/colvars/colvarbias_alb.h index 0b32cb8545..d8c46b499f 100644 --- a/lib/colvars/colvarbias_alb.h +++ b/lib/colvars/colvarbias_alb.h @@ -1,3 +1,5 @@ +// -*- c++ -*- + #ifndef COLVARBIAS_ALB_H #define COLVARBIAS_ALB_H diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 55f49cd21e..2528088926 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -1,6 +1,8 @@ /// -*- c++ -*- #include +#include + #include "colvarmodule.h" #include "colvarparse.h" #include "colvarproxy.h" @@ -255,6 +257,7 @@ int colvarmodule::parse_biases_type(std::string const &conf, } bias_conf = ""; } + return COLVARS_OK; } @@ -573,7 +576,7 @@ int colvarmodule::calc() { // write trajectory file, if needed if (cv_traj_freq && cv_traj_name.size()) { - if (!cv_traj_os.good()) { + if (!cv_traj_os.is_open()) { open_traj_file(cv_traj_name); } @@ -734,21 +737,10 @@ int colvarmodule::setup_output() std::string("")); if (cv_traj_freq && cv_traj_name.size()) { - // open trajectory file - if (cv_traj_append) { - cvm::log("Appending to colvar trajectory file \""+cv_traj_name+ - "\".\n"); - cv_traj_os.open(cv_traj_name.c_str(), std::ios::app); - } else { - cvm::log("Writing to colvar trajectory file \""+cv_traj_name+ - "\".\n"); - proxy->backup_file(cv_traj_name.c_str()); - cv_traj_os.open(cv_traj_name.c_str(), std::ios::out); - } - cv_traj_os.setf(std::ios::scientific, std::ios::floatfield); + open_traj_file(cv_traj_name); } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } @@ -928,21 +920,27 @@ std::ostream & colvarmodule::write_restart(std::ostream &os) int colvarmodule::open_traj_file(std::string const &file_name) { + if (cv_traj_os.is_open()) { + return COLVARS_OK; + } + // (re)open trajectory file if (cv_traj_append) { cvm::log("Appending to colvar trajectory file \""+file_name+ "\".\n"); cv_traj_os.open(file_name.c_str(), std::ios::app); } else { - cvm::log("Overwriting colvar trajectory file \""+file_name+ + cvm::log("Writing to colvar trajectory file \""+file_name+ "\".\n"); proxy->backup_file(file_name.c_str()); cv_traj_os.open(file_name.c_str(), std::ios::out); } - if (!cv_traj_os.good()) { + + if (!cv_traj_os.is_open()) { cvm::error("Error: cannot write to file \""+file_name+"\".\n", FILE_ERROR); } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index edf62f1f88..bcfc6a1d9e 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -4,7 +4,7 @@ #define COLVARMODULE_H #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2014-11-06" +#define COLVARS_VERSION "2014-11-13" #endif #ifndef COLVARS_DEBUG diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index 9d3c73e109..e9388f68fb 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -170,7 +170,7 @@ public: virtual int run_colvar_gradient_callback(std::string const &name, std::vector const &cvcs, - std::vector &gradient) + std::vector > &gradient) { return COLVARS_NOT_IMPLEMENTED; } // **************** INPUT/OUTPUT **************** diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index a550a09915..0c3a90efbf 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -1,6 +1,9 @@ // -*- c++ -*- #include +#include +#include + #include "colvarscript.h" @@ -290,10 +293,6 @@ int colvarscript::proc_bias(int argc, char const *argv[]) { // Subcommands for MW ABF if (subcmd == "bin") { int r = b->current_bin(); - if (r < 0) { - result = "Error: calling current_bin() for bias " + b->name; - return COLVARSCRIPT_ERROR; - } result = cvm::to_str(r); return COLVARSCRIPT_OK; } diff --git a/lib/colvars/colvartypes.cpp b/lib/colvars/colvartypes.cpp index 120342e71f..2ec448bd14 100644 --- a/lib/colvars/colvartypes.cpp +++ b/lib/colvars/colvartypes.cpp @@ -1,4 +1,7 @@ -/// -*- c++ -*- +// -*- c++ -*- + +#include +#include #include "colvarmodule.h" #include "colvartypes.h" diff --git a/lib/colvars/colvartypes.h b/lib/colvars/colvartypes.h index 9bed239962..5680fb93e8 100644 --- a/lib/colvars/colvartypes.h +++ b/lib/colvars/colvartypes.h @@ -29,12 +29,9 @@ protected: public: - size_t length; - /// Default constructor inline vector1d(size_t const n = 0) { - length = n; data.resize(n); reset(); } @@ -42,7 +39,6 @@ public: /// Constructor from C array inline vector1d(size_t const n, T const *t) { - length = n; data.resize(n); reset(); size_t i; @@ -405,6 +401,11 @@ public: data.assign(data.size(), T(0.0)); } + inline size_t size() const + { + return data.size(); + } + /// Default constructor inline matrix2d() : outer_length(0), inner_length(0) @@ -557,26 +558,63 @@ public: } /// Matrix multiplication - inline friend matrix2d const & operator * (matrix2d const &m1, matrix2d const &m2) +// inline friend matrix2d const & operator * (matrix2d const &m1, matrix2d const &m2) +// { +// matrix2d result(m1.outer_length, m2.inner_length); +// if (m1.inner_length != m2.outer_length) { +// cvm::error("Error: trying to multiply two matrices of incompatible sizes, "+ +// cvm::to_str(m1.outer_length)+"x"+cvm::to_str(m1.inner_length)+" and "+ +// cvm::to_str(m2.outer_length)+"x"+cvm::to_str(m2.inner_length)+".\n"); +// } else { +// size_t i, j, k; +// for (i = 0; i < m1.outer_length; i++) { +// for (j = 0; j < m2.inner_length; j++) { +// for (k = 0; k < m1.inner_length; k++) { +// result[i][j] += m1[i][k] * m2[k][j]; +// } +// } +// } +// } +// return result; +// } + + /// vector-matrix multiplication + inline friend vector1d operator * (vector1d const &v, matrix2d const &m) { - matrix2d result(m1.outer_length, m2.inner_length); - if (m1.inner_length != m2.outer_length) { - cvm::error("Error: trying to multiply two matrices of incompatible sizes, "+ - cvm::to_str(m1.outer_length)+"x"+cvm::to_str(m1.inner_length)+" and "+ - cvm::to_str(m2.outer_length)+"x"+cvm::to_str(m2.inner_length)+".\n"); + vector1d result(m.inner_length); + if (m.outer_length != v.size()) { + cvm::error("Error: trying to multiply a vector and a matrix of incompatible sizes, "+ + cvm::to_str(v.size()) + " and " + cvm::to_str(m.outer_length)+"x"+cvm::to_str(m.inner_length) + ".\n"); } else { - size_t i, j, k; - for (i = 0; i < m1.outer_length; i++) { - for (j = 0; j < m2.inner_length; j++) { - for (k = 0; k < m1.inner_length; k++) { - result[i][j] += m1[i][k] * m2[k][j]; - } + size_t i, k; + for (i = 0; i < m.inner_length; i++) { + for (k = 0; k < m.outer_length; k++) { + result[i] += m[k][i] * v[k]; } } } return result; } +// /// matrix-vector multiplication (unused for now) +// inline friend vector1d const & operator * (matrix2d const &m, vector1d const &v) +// { +// vector1d result(m.outer_length); +// if (m.inner_length != v.size()) { +// cvm::error("Error: trying to multiply a matrix and a vector of incompatible sizes, "+ +// cvm::to_str(m.outer_length)+"x"+cvm::to_str(m.inner_length) +// + " and " + cvm::to_str(v.length) + ".\n"); +// } else { +// size_t i, k; +// for (i = 0; i < m.outer_length; i++) { +// for (k = 0; k < m.inner_length; k++) { +// result[i] += m[i][k] * v[k]; +// } +// } +// } +// return result; +// } + /// Formatted output friend std::ostream & operator << (std::ostream &os, matrix2d const &m) diff --git a/lib/colvars/colvarvalue.h b/lib/colvars/colvarvalue.h index 16fc5737ca..3f74fedb47 100644 --- a/lib/colvars/colvarvalue.h +++ b/lib/colvars/colvarvalue.h @@ -16,20 +16,21 @@ /// treat different data types. By default, a \link colvarvalue /// \endlink variable is a scalar number. To use it as /// another type, declare and initialize it as -/// \code colvarvalue x(colvarvalue::type_xxx), use \link x.type +/// \code colvarvalue x(colvarvalue::type_xxx)\endcode, use \link x.type /// (colvarvalue::type_xxx) \endlink at a later stage, or if unset, -// assign the type with \code x = y; \endcode, provided y is correctly set. +/// assign the type with \code x = y; \endcode, provided y is correctly set. /// /// All operators (either unary or binary) on a \link /// colvarvalue \endlink object performs one or more checks on the /// \link Type \endlink, except when reading from a stream, when there is no way to /// detect the \link Type \endlink. To use \code is >> x; \endcode x \b MUST /// already have a type correcly set up for properly parsing the -/// stream. No problem of course with the output streams: \code os << x; +/// stream. No problem of course with the output streams: \code os << x; \endcode /// /// \em Note \em on \em performance: to avoid type checks in a long array of \link /// colvarvalue \endlink objects, use one of the existing "_opt" functions or implement a new one + class colvarvalue { public: @@ -55,7 +56,9 @@ public: /// 4-dimensional vector that is a derivative of a quaternion type_quaternionderiv, /// vector (arbitrary dimension) - type_vector + type_vector, + /// Needed to iterate through enum + type_all }; /// Current type of this colvarvalue object @@ -501,9 +504,6 @@ inline size_t colvarvalue::size() const inline colvarvalue::colvarvalue(colvarvalue const &x) : value_type(x.type()) { - // reset the value based on the previous type - reset(); - switch (x.type()) { case type_scalar: real_value = x.real_value; @@ -530,9 +530,7 @@ inline colvarvalue::colvarvalue(colvarvalue const &x) inline colvarvalue::colvarvalue(cvm::vector1d const &v, Type const &vti) { - // reset the value based on the previous type - reset(); - if ((vti != type_vector) && (v.size() != num_dimensions(value_type))) { + if ((vti != type_vector) && (v.size() != num_dimensions(vti))) { cvm::error("Error: trying to initialize a variable of type \""+type_desc(vti)+ "\" using a vector of size "+cvm::to_str(v.size())+ ".\n"); @@ -770,7 +768,7 @@ inline cvm::vector1d const colvarvalue::as_vector() const case colvarvalue::type_scalar: { cvm::vector1d v(1); - v = real_value; + v[0] = real_value; return v; } case colvarvalue::type_3vector: