00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "QMCElectronNucleusCusp.h"
00014
00015 QMCElectronNucleusCusp::QMCElectronNucleusCusp()
00016 {
00017 }
00018
00019 void QMCElectronNucleusCusp::operator=(const QMCElectronNucleusCusp& rhs)
00020 {
00021 Input = rhs.Input;
00022 Molecule = rhs.Molecule;
00023 BF = rhs.BF;
00024
00025 ORWF_coeffs = rhs.ORWF_coeffs;
00026
00027 natoms = rhs.natoms;
00028 norbitals = rhs.norbitals;
00029
00030 ORParams = rhs.ORParams;
00031 }
00032
00033 void QMCElectronNucleusCusp::initialize(QMCInput* input, const Array2D<qmcfloat>& WFCoeffs)
00034 {
00035 Input = input;
00036 Molecule = &Input->Molecule;
00037 BF = &Input->BF;
00038 ORWF_coeffs = WFCoeffs;
00039
00040 natoms = Molecule->getNumberAtoms();
00041 norbitals = ORWF_coeffs.dim1();
00042
00043 ORParams.allocate(natoms,norbitals);
00044 }
00045
00046 void QMCElectronNucleusCusp::fitReplacementOrbitals()
00047 {
00048 int BFindex = 0;
00049 int nSGaussians = 0;
00050 int counter = 0;
00051 double xnuc,ynuc,znuc;
00052 double xrel,yrel,zrel,rsqrel,xyz;
00053 int a,b,c;
00054 double temp,p0,p1;
00055 bool repOrbitalNeeded;
00056
00057 for (int i=0; i<natoms; i++)
00058 {
00059 BF_coeffs = BF->getBFCoeffs(i);
00060
00061
00062 nSGaussians = 0;
00063 for (int k=0; k<BF_coeffs->getNumberBasisFunctions(); k++)
00064 if (BF_coeffs->Type(k) == "s")
00065 nSGaussians += BF_coeffs->N_Gauss(k);
00066
00067 sTypeCoeffs.allocate(nSGaussians,2);
00068
00069
00070 if (nSGaussians == 0)
00071 {
00072 QMCElectronNucleusCuspParameters TRASH;
00073 TRASH.set_rc(0.0);
00074 for (int m=0; m<norbitals; m++)
00075 ORParams(i,m) = TRASH;
00076 continue;
00077 }
00078
00079
00080 BFindex = 0;
00081 for (int j=0; j<i; j++)
00082 BFindex += BF->getNumberBasisFunctions(j);
00083
00084 Z = Molecule->Z(i);
00085
00086 xnuc = Molecule->Atom_Positions(i,0);
00087 ynuc = Molecule->Atom_Positions(i,1);
00088 znuc = Molecule->Atom_Positions(i,2);
00089
00090 for (int m=0; m<norbitals; m++)
00091 {
00092 counter = 0;
00093 BF_coeffs = BF->getBFCoeffs(i);
00094 for (int k=0; k<BF_coeffs->getNumberBasisFunctions(); k++)
00095 if (BF_coeffs->Type(k) == "s")
00096 for (int l=0; l<BF_coeffs->N_Gauss(k); l++)
00097 {
00098 sTypeCoeffs(counter,0) = BF_coeffs->Coeffs(k,l,0);
00099 sTypeCoeffs(counter,1) = BF_coeffs->Coeffs(k,l,1) *
00100 ORWF_coeffs(m,BFindex+k);
00101 counter++;
00102 }
00103
00104
00105
00106
00107 repOrbitalNeeded = false;
00108 for (int k=0; k<nSGaussians; k++)
00109 if ( fabs(sTypeCoeffs(k,1)) > 1e-15 )
00110 {
00111 repOrbitalNeeded = true;
00112 break;
00113 }
00114
00115 if (repOrbitalNeeded == false)
00116 {
00117 QMCElectronNucleusCuspParameters TRASH;
00118 TRASH.set_rc(0.0);
00119 ORParams(i,m) = TRASH;
00120 continue;
00121 }
00122
00123
00124
00125 determineRc();
00126
00127
00128
00129 n0 = 0.0;
00130 counter = 0;
00131 for (int j=0; j<natoms; j++)
00132 {
00133 if (j != i)
00134 {
00135 xrel = xnuc - Molecule->Atom_Positions(j,0);
00136 yrel = ynuc - Molecule->Atom_Positions(j,1);
00137 zrel = znuc - Molecule->Atom_Positions(j,2);
00138 rsqrel = xrel*xrel + yrel*yrel + zrel*zrel;
00139 BF_coeffs = BF->getBFCoeffs(j);
00140 for (int k=0; k<BF_coeffs->getNumberBasisFunctions(); k++)
00141 {
00142 a = BF_coeffs->xyz_powers(k,0);
00143 b = BF_coeffs->xyz_powers(k,1);
00144 c = BF_coeffs->xyz_powers(k,2);
00145 xyz = pow(xrel,a)*pow(yrel,b)*pow(zrel,c);
00146 temp = 0.0;
00147 for (int l=0; l<BF_coeffs->N_Gauss(k); l++)
00148 {
00149 p0 = BF_coeffs->Coeffs(k,l,0);
00150 p1 = BF_coeffs->Coeffs(k,l,1);
00151 temp += p1*exp(-p0*rsqrel);
00152 }
00153 n0 += temp*xyz*ORWF_coeffs(m,counter);
00154 counter++;
00155 }
00156 }
00157 else if (j == i)
00158 counter += BF->getNumberBasisFunctions(i);
00159 }
00160
00161
00162
00163
00164 ORParams(i,m) = fitOrbitalParameters();
00165
00166
00167
00168 }
00169 }
00170 }
00171
00172 void QMCElectronNucleusCusp::determineRc()
00173 {
00174
00175 const double rcmax = 1.0/Z;
00176
00177
00178 if (Z > 1)
00179 {
00180 idealCurveParams.allocate(9);
00181
00182 idealCurveParams(8) = 1.94692;
00183 idealCurveParams(7) = -12.1316;
00184 idealCurveParams(6) = 31.2276;
00185 idealCurveParams(5) = -42.8705;
00186 idealCurveParams(4) = 33.7308;
00187 idealCurveParams(3) = -15.0126;
00188 idealCurveParams(2) = 3.25819;
00189 idealCurveParams(1) = 0.0;
00190 idealCurveParams(0) = 0.0;
00191
00192 idealCurve.initialize(idealCurveParams);
00193 idealCurve.evaluate(rcmax);
00194 idealCurveParams(0) = getOrigLocalEnergy(rcmax)/(Z*Z) - idealCurve.getFunctionValue();
00195
00196 idealCurve.initialize(idealCurveParams);
00197 }
00198
00199 else if (Z == 1)
00200 {
00201 idealCurveParams.allocate(1);
00202 idealCurveParams(0) = getOrigLocalEnergy(rcmax);
00203 idealCurve.initialize(idealCurveParams);
00204 }
00205 else
00206 {
00207 cerr << "ERROR in QMCElectronNucleusCusp: Z = " << Z << endl;
00208 exit(0);
00209 }
00210
00211
00212
00213 const double dr = rcmax/100;
00214 double old_value = evaluateOrigOrbital(rcmax);
00215 double new_value = 0.0;
00216 int nRoots = 0;
00217 list<int> rtIndex;
00218 Array1D<double> roots;
00219
00220 for (int i=0; i<101; i++)
00221 {
00222 new_value = evaluateOrigOrbital(rcmax-i*dr);
00223 if (new_value*old_value < 0)
00224 {
00225 rtIndex.push_back(i);
00226 nRoots++;
00227 }
00228 old_value = new_value;
00229 }
00230
00231
00232
00233 if (nRoots > 0)
00234 {
00235 roots.allocate(nRoots);
00236 int counter = 0;
00237
00238 double rl = 0.0;
00239 double rh = 0.0;
00240 double fl = 0.0;
00241 double fh = 0.0;
00242 double rm = 0.0;
00243 double fm = 0.0;
00244
00245 const double tol = 1e-8;
00246
00247 for (list<int>::iterator rp=rtIndex.begin(); rp!=rtIndex.end(); ++rp)
00248 {
00249 rl = rcmax-(*rp)*dr;
00250 fl = evaluateOrigOrbital(rl);
00251 rh = rl+dr;
00252 fh = evaluateOrigOrbital(rh);
00253
00254 if (fl*fh > 0)
00255 {
00256 cerr << "ERROR in QMCElectronNucleusCusp::determineRc(): ";
00257 cerr << rl << " and " << rh << " do not bracket a root" << endl;
00258 exit(0);
00259 }
00260 if (fabs(fl)<tol)
00261 {
00262 roots(counter) = rl;
00263 counter++;
00264 continue;
00265 }
00266 else if (fabs(fh)<tol)
00267 {
00268 roots(counter) = rh;
00269 counter++;
00270 continue;
00271 }
00272 else
00273 {
00274 for (int i=0; i<10000; i++)
00275 {
00276 if (i == 9999)
00277 {
00278 cerr << "ERROR in ";
00279 cerr << "QMCElectronNucleusCusp::determineRc(): ";
00280 cerr << " too many iterations in finding root" << endl;
00281 exit(0);
00282 }
00283 rm = (rl+rh)/2;
00284 fm = evaluateOrigOrbital(rm);
00285
00286 if (fabs(fm)<tol)
00287 {
00288 roots(counter) = rm;
00289 counter++;
00290 break;
00291 }
00292 else if (fm*fl<0)
00293 {
00294
00295 rh = rm;
00296 fh = fm;
00297 }
00298 else
00299 {
00300
00301 rl = rm;
00302 fl = fm;
00303 }
00304 }
00305 continue;
00306 }
00307 }
00308 }
00309
00310
00311
00312
00313
00314
00315 double origGradientNearNucleus = getOrigGradient(rcmax/1000);
00316 double origValueAtNucleus = evaluateOrigOrbital(0.0);
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 rc = rcmax;
00329 double r_trial = rcmax;
00330 int rootIndex = -1;
00331 double r_bound = 0.0;
00332 const double ddr = dr/10;
00333 const double maxdev = Z*Z/50.0;
00334
00335 if (nRoots>0)
00336 {
00337 rootIndex = nRoots-1;
00338 r_bound = roots(rootIndex) + rcmax/5;
00339 }
00340
00341 while (r_trial > 0.0)
00342 {
00343 if (origGradientNearNucleus*(evaluateOrigOrbital(r_trial)-origValueAtNucleus) > 0.0)
00344 {
00345 if (r_trial > r_bound)
00346 {
00347 idealCurve.evaluate(r_trial);
00348 old_value = getOrigLocalEnergy(r_trial);
00349 if (fabs(Z*Z*idealCurve.getFunctionValue()-old_value) > maxdev)
00350 {
00351 r_trial += dr;
00352 while (r_trial > 0.0)
00353 {
00354 r_trial -= ddr;
00355 if (origGradientNearNucleus*(evaluateOrigOrbital(r_trial)-origValueAtNucleus) > 0.0)
00356 {
00357 idealCurve.evaluate(r_trial);
00358 old_value = getOrigLocalEnergy(r_trial);
00359 if (fabs(Z*Z*idealCurve.getFunctionValue()-old_value)>maxdev)
00360 {
00361 rc = r_trial;
00362 break;
00363 }
00364 }
00365 }
00366 break;
00367 }
00368 }
00369 else
00370 {
00371 idealCurve.evaluate(r_bound);
00372 old_value = getOrigLocalEnergy(r_bound);
00373 if ( (origGradientNearNucleus*(evaluateOrigOrbital(r_trial)-origValueAtNucleus) > 0.0) && (fabs(Z*Z*idealCurve.getFunctionValue()-old_value) > maxdev) )
00374 {
00375 while (r_trial > 0.0)
00376 {
00377 r_trial -= ddr;
00378 idealCurve.evaluate(r_trial);
00379 old_value = getOrigLocalEnergy(r_trial);
00380 if (fabs(Z*Z*idealCurve.getFunctionValue()-old_value)>maxdev)
00381 {
00382 rc = r_trial;
00383 break;
00384 }
00385 }
00386 break;
00387 }
00388 else
00389 {
00390 r_trial = roots(rootIndex) - rcmax/5 + dr;
00391 if (rootIndex > 0)
00392 {
00393 rootIndex--;
00394 r_bound = roots(rootIndex) + rcmax/5;
00395 }
00396 else if (rootIndex == 0)
00397 r_bound = 0.0;
00398 }
00399 }
00400 }
00401 r_trial -= dr;
00402 }
00403
00404
00405 if (Z > 1)
00406 {
00407 idealCurveParams(0) = 0.0;
00408
00409 idealCurve.initialize(idealCurveParams);
00410 idealCurve.evaluate(rc);
00411 idealCurveParams(0) = getOrigLocalEnergy(rc)/(Z*Z) - idealCurve.getFunctionValue();
00412
00413 idealCurve.initialize(idealCurveParams);
00414 }
00415
00416 else if (Z == 1)
00417 {
00418 idealCurveParams.allocate(1);
00419 idealCurveParams(0) = getOrigLocalEnergy(rc);
00420 idealCurve.initialize(idealCurveParams);
00421 }
00422 }
00423
00424 QMCElectronNucleusCuspParameters QMCElectronNucleusCusp::fitOrbitalParameters()
00425 {
00426
00427
00428
00429
00430 QMCElectronNucleusCuspParameters loParams;
00431 QMCElectronNucleusCuspParameters midParams;
00432 QMCElectronNucleusCuspParameters hiParams;
00433
00434 loParams.initialize(sTypeCoeffs,n0,rc,idealCurve,Z);
00435 midParams.initialize(sTypeCoeffs,n0,rc,idealCurve,Z);
00436 hiParams.initialize(sTypeCoeffs,n0,rc,idealCurve,Z);
00437
00438
00439
00440 double origAtOrigin = evaluateOrigOrbital(0.0);
00441 double origAtRc = evaluateOrigOrbital(rc);
00442
00443 double lo_phi = 0.0;
00444 double mid_phi = 0.0;
00445 double hi_phi = 0.0;
00446
00447 if (origAtOrigin-origAtRc < 0.0)
00448 {
00449 hi_phi = origAtOrigin;
00450 mid_phi = origAtOrigin - fabs(origAtOrigin*0.05);
00451 lo_phi = origAtOrigin - fabs(origAtOrigin*0.1);
00452 }
00453 else
00454 {
00455 lo_phi = origAtOrigin;
00456 mid_phi = origAtOrigin + fabs(origAtOrigin*0.05);
00457 hi_phi = origAtOrigin + fabs(origAtOrigin*0.1);
00458 }
00459
00460 loParams.fitReplacementOrbital(lo_phi);
00461 midParams.fitReplacementOrbital(mid_phi);
00462 hiParams.fitReplacementOrbital(hi_phi);
00463
00464 double loSigmaSq = loParams.getSigmaSq();
00465 double midSigmaSq = midParams.getSigmaSq();
00466 double hiSigmaSq = hiParams.getSigmaSq();
00467
00468 #define GOLD 0.618034
00469
00470
00471
00472 while (true)
00473 {
00474 if (midSigmaSq < hiSigmaSq && midSigmaSq < loSigmaSq)
00475
00476 break;
00477 if (origAtOrigin-origAtRc > 0.0)
00478 {
00479 if (hiSigmaSq > loSigmaSq)
00480 break;
00481 else
00482 {
00483 lo_phi = mid_phi;
00484 mid_phi = hi_phi;
00485 hi_phi += (1+GOLD)*(mid_phi-lo_phi);
00486
00487 loParams = midParams;
00488 midParams = hiParams;
00489 hiParams.fitReplacementOrbital(hi_phi);
00490
00491 loSigmaSq = midSigmaSq;
00492 midSigmaSq = hiSigmaSq;
00493 hiSigmaSq = hiParams.getSigmaSq();
00494 }
00495 }
00496 else
00497 {
00498 if (loSigmaSq > hiSigmaSq)
00499 break;
00500 else
00501 {
00502 hi_phi = mid_phi;
00503 mid_phi = lo_phi;
00504 lo_phi -= (1+GOLD)*(hi_phi-mid_phi);
00505
00506 hiParams = midParams;
00507 midParams = loParams;
00508 loParams.fitReplacementOrbital(lo_phi);
00509
00510 hiSigmaSq = midSigmaSq;
00511 midSigmaSq = loSigmaSq;
00512 loSigmaSq = loParams.getSigmaSq();
00513 }
00514 }
00515 }
00516
00517
00518 double new_phi = 0.0;
00519 double newSigmaSq = 0.0;
00520 QMCElectronNucleusCuspParameters newParams;
00521
00522 newParams.initialize(sTypeCoeffs,n0,rc,idealCurve,Z);
00523
00524 while (hi_phi-lo_phi > fabs(mid_phi/10000))
00525 {
00526
00527 if (mid_phi-lo_phi >= hi_phi-mid_phi)
00528 {
00529 new_phi = mid_phi - GOLD*(mid_phi-lo_phi);
00530 newParams.fitReplacementOrbital(new_phi);
00531 newSigmaSq = newParams.getSigmaSq();
00532 if (loSigmaSq < hiSigmaSq)
00533 {
00534 midParams = newParams;
00535 hiParams = midParams;
00536
00537 mid_phi = new_phi;
00538 hi_phi = mid_phi;
00539
00540 midSigmaSq = newSigmaSq;
00541 hiSigmaSq = midSigmaSq;
00542 }
00543 else
00544 {
00545 loParams = newParams;
00546 lo_phi = new_phi;
00547 loSigmaSq = newSigmaSq;
00548 }
00549 }
00550 else
00551 {
00552 new_phi = mid_phi + GOLD*(hi_phi-mid_phi);
00553 newParams.fitReplacementOrbital(new_phi);
00554 newSigmaSq = newParams.getSigmaSq();
00555 if (loSigmaSq < hiSigmaSq)
00556 {
00557 hiParams = newParams;
00558 hi_phi = new_phi;
00559 hiSigmaSq = newSigmaSq;
00560 }
00561 else
00562 {
00563 loParams = midParams;
00564 midParams = newParams;
00565
00566 lo_phi = mid_phi;
00567 mid_phi = new_phi;
00568
00569 loSigmaSq = midSigmaSq;
00570 midSigmaSq = newSigmaSq;
00571 }
00572 }
00573 }
00574 #undef GOLD
00575
00576
00577 return midParams;
00578 }
00579
00580 void QMCElectronNucleusCusp::replaceCusps(Array2D<double> & X,
00581 int Start, int Stop,
00582 Array2D<qmcfloat> & D,
00583 Array2D<qmcfloat> & GradX,
00584 Array2D<qmcfloat> & GradY,
00585 Array2D<qmcfloat> & GradZ,
00586 Array2D<qmcfloat> & Laplacian_D)
00587 {
00588
00589
00590
00591 double xnuc,ynuc,znuc;
00592 double xrel,yrel,zrel,rrel;
00593 double temp_value,temp_gradx,temp_grady,temp_gradz,temp_lap;
00594 int counter = 0;
00595
00596 if(Stop - Start + 1 != D.dim1())
00597 {
00598 cout << "Warning: dimensions don't match in QMCElectronNucleusCusp." << endl;
00599 cout << " Start = " << Start << endl;
00600 cout << " Stop = " << Stop << endl;
00601 cout << "D.dim1 = " << D.dim1() << endl;
00602 }
00603
00604 for (int i=0; i<natoms; i++)
00605 {
00606 xnuc = Molecule->Atom_Positions(i,0);
00607 ynuc = Molecule->Atom_Positions(i,1);
00608 znuc = Molecule->Atom_Positions(i,2);
00609
00610 counter = 0;
00611 for (int j=Start; j<=Stop; j++)
00612 {
00613 xrel = X(j,0) - xnuc;
00614 yrel = X(j,1) - ynuc;
00615 zrel = X(j,2) - znuc;
00616 rrel = sqrt(xrel*xrel + yrel*yrel + zrel*zrel);
00617
00618 for (int k=0; k<norbitals; k++)
00619 {
00620 if (rrel < ORParams(i,k).get_rc())
00621 {
00622 temp_value = 0.0;
00623 temp_gradx = 0.0;
00624 temp_grady = 0.0;
00625 temp_gradz = 0.0;
00626 temp_lap = 0.0;
00627
00628 ORParams(i,k).replaceOrbitalValues(xrel,yrel,zrel,rrel,
00629 temp_value,temp_gradx,temp_grady,temp_gradz,temp_lap);
00630
00631 D(counter,k) += temp_value;
00632 GradX(counter,k) += temp_gradx;
00633 GradY(counter,k) += temp_grady;
00634 GradZ(counter,k) += temp_gradz;
00635 Laplacian_D(counter,k) += temp_lap;
00636 }
00637 }
00638 counter++;
00639 }
00640 }
00641 }
00642
00643 void QMCElectronNucleusCusp::replaceCusps(Array2D<double> & X,
00644 int Start, int Stop,
00645 Array2D<qmcfloat> & D)
00646 {
00647
00648
00649
00650 double xnuc,ynuc,znuc;
00651 double xrel,yrel,zrel,rrel;
00652 double temp_value;
00653 int counter = 0;
00654
00655 if(Stop - Start + 1 != D.dim1())
00656 {
00657 cout << "Warning: dimensions don't match in QMCElectronNucleusCusp." << endl;
00658 cout << " Start = " << Start << endl;
00659 cout << " Stop = " << Stop << endl;
00660 cout << "D.dim1 = " << D.dim1() << endl;
00661 }
00662
00663 for (int i=0; i<natoms; i++)
00664 {
00665 xnuc = Molecule->Atom_Positions(i,0);
00666 ynuc = Molecule->Atom_Positions(i,1);
00667 znuc = Molecule->Atom_Positions(i,2);
00668
00669 counter = 0;
00670 for (int j=Start; j<=Stop; j++)
00671 {
00672 xrel = X(j,0) - xnuc;
00673 yrel = X(j,1) - ynuc;
00674 zrel = X(j,2) - znuc;
00675 rrel = sqrt(xrel*xrel + yrel*yrel + zrel*zrel);
00676
00677 for (int k=0; k<norbitals; k++)
00678 {
00679 if (rrel < ORParams(i,k).get_rc())
00680 {
00681 temp_value = 0.0;
00682
00683 ORParams(i,k).replaceOrbitalValues(xrel,yrel,zrel,rrel,
00684 temp_value);
00685
00686 D(counter,k) += temp_value;
00687 }
00688 }
00689 counter++;
00690 }
00691 }
00692 }
00693
00694 double QMCElectronNucleusCusp::getOrigLocalEnergy(double r_orig)
00695 {
00696 double r_sq = r_orig*r_orig;
00697 int nGaussians = sTypeCoeffs.dim1();
00698
00699 double term_value = 0.0;
00700 double p0 = 0.0;
00701 double p1 = 0.0;
00702
00703 double orig_value = 0.0;
00704 double laplacian = 0.0;
00705
00706 for (int i=0; i<nGaussians; i++)
00707 {
00708 p0 = sTypeCoeffs(i,0);
00709 p1 = sTypeCoeffs(i,1);
00710 term_value = p1*exp(-p0*r_sq);
00711
00712 orig_value += term_value;
00713 laplacian += 2*p0*(2*p0*r_sq-3)*term_value;
00714 }
00715
00716 laplacian = laplacian/orig_value;
00717
00718 return -0.5*laplacian - Z/r_orig;
00719 }
00720
00721 double QMCElectronNucleusCusp::getOrigGradient(double r_orig)
00722 {
00723 double r_sq = r_orig*r_orig;
00724 int nGaussians = sTypeCoeffs.dim1();
00725
00726 double term_gradient = 0.0;
00727 double p0 = 0.0;
00728 double p1 = 0.0;
00729
00730 double orig_gradient = 0.0;
00731
00732 for (int i=0; i<nGaussians; i++)
00733 {
00734 p0 = sTypeCoeffs(i,0);
00735 p1 = sTypeCoeffs(i,1);
00736 term_gradient = -p0*2*r_orig*p1*exp(-p0*r_sq);
00737
00738 orig_gradient += term_gradient;
00739 }
00740 return orig_gradient;
00741 }
00742
00743 double QMCElectronNucleusCusp::evaluateOrigOrbital(double r_orig)
00744 {
00745 double r_sq = r_orig*r_orig;
00746 int nGaussians = sTypeCoeffs.dim1();
00747
00748 double term_value = 0.0;
00749 double p0 = 0.0;
00750 double p1 = 0.0;
00751
00752 double orig_value = 0.0;
00753
00754 for (int i=0; i<nGaussians; i++)
00755 {
00756 p0 = sTypeCoeffs(i,0);
00757 p1 = sTypeCoeffs(i,1);
00758 term_value = p1*exp(-p0*r_sq);
00759
00760 orig_value += term_value;
00761 }
00762 return orig_value;
00763 }
00764
00765 ostream& operator <<(ostream& strm, QMCElectronNucleusCusp &rhs)
00766 {
00767
00768
00769 return strm;
00770 }