32#ifndef MADNESS_MRA_MRAIMPL_H__INCLUDED
33#define MADNESS_MRA_MRAIMPL_H__INCLUDED
36#error "mraimpl.h should ONLY be included in one of the mraX.cc files (x=1..6)"
55 bool isnan(
const std::complex<T>&
v) {
71 template <
typename T, std::
size_t NDIM>
73 if (!
two_scale_hg(
k, &hg))
throw "failed to get twoscale coefficients";
80 h1 =
copy(hg(sk,sk2));
91 template <
typename T, std::
size_t NDIM>
101 for (
int mu=0;
mu<npt; ++
mu) {
104 for (
int j=0; j<
k; ++j) {
105 quad_phi(
mu,j) = phi[j];
106 quad_phiw(
mu,j) = quad_w(
mu)*phi[j];
112 template <
typename T, std::
size_t NDIM>
120 template <
typename T, std::
size_t NDIM>
124 for (
const auto& [key, node] : coeffs) {
126 if (key.level() > 0) {
128 typename dcT::const_iterator pit = coeffs.find(parent).get();
129 if (pit == coeffs.end()) {
130 print(world.rank(),
"FunctionImpl: verify: MISSING PARENT",key,parent);
135 const nodeT& pnode = pit->second;
136 if (!pnode.has_children()) {
137 print(world.rank(),
"FunctionImpl: verify: PARENT THINKS IT HAS NO CHILDREN",key,parent);
145 typename dcT::const_iterator cit = coeffs.find(kit.key()).get();
146 if (cit == coeffs.end()) {
147 if (node.has_children()) {
148 print(world.rank(),
"FunctionImpl: verify: MISSING CHILD",key,kit.key());
155 if (! node.has_children()) {
156 print(world.rank(),
"FunctionImpl: verify: UNEXPECTED CHILD",key,kit.key());
170 template<
typename T, std::
size_t NDIM>
176 auto check_internal_coeff_size = [&state, &
k](
const coeffT&
c) {
178 return c.dim(0)==2*
k;
184 auto check_leaf_coeff_size = [&state, &
k](
const coeffT&
c) {
195 for (
const auto& [key, node] : coeffs) {
196 const auto&
c=node.coeff();
197 const bool is_internal=node.has_children();
198 const bool is_leaf=not node.has_children();
199 if (is_internal) good=good and check_internal_coeff_size(
c);
200 if (is_leaf) good=good and check_leaf_coeff_size(
c);
202 print(
"incorrect size of coefficients for key",key,
"state",state,
c.dim(0));;
208 template <
typename T, std::
size_t NDIM>
224 template <
typename T, std::
size_t NDIM>
226 const double beta,
const implT&
g,
const bool fence) {
231 ProcessID owner = coeffs.owner(cdata.key0);
232 if (world.rank() == owner) {
240 apply_opT apply_op(
this);
242 woT::task(world.rank(), &implT:: template forward_traverse<coeff_opT,apply_opT>,
243 coeff_op, apply_op, cdata.key0);
247 if (fence) world.gop.fence();
251 template <
typename T, std::
size_t NDIM>
257 template <
typename T, std::
size_t NDIM>
263 template <
typename T, std::
size_t NDIM>
269 template <
typename T, std::
size_t NDIM>
274 template <
typename T, std::
size_t NDIM>
279 template <
typename T, std::
size_t NDIM>
284 template <
typename T, std::
size_t NDIM>
289 template <
typename T, std::
size_t NDIM>
294 template <
typename T, std::
size_t NDIM>
296 return is_reconstructed() or is_compressed() or has_coefficients_on_leaves_only();
299 template <
typename T, std::
size_t NDIM>
304 template <
typename T, std::
size_t NDIM>
311 template <
typename T, std::
size_t NDIM>
317 template <
typename T, std::
size_t NDIM>
323 template <
typename T, std::
size_t NDIM>
330 template <
typename T, std::
size_t NDIM>
333 template <
typename T, std::
size_t NDIM>
336 template <
typename T, std::
size_t NDIM>
339 template <
typename T, std::
size_t NDIM>
342 template <
typename T, std::
size_t NDIM>
345 template <
typename T, std::
size_t NDIM>
348 template <
typename T, std::
size_t NDIM>
351 template <
typename T, std::
size_t NDIM>
354 template <
typename T, std::
size_t NDIM>
357 template <
typename T, std::
size_t NDIM>
360 template <
typename T, std::
size_t NDIM>
363 template <
typename T, std::
size_t NDIM>
365 timer_accumulate.accumulate(time);
368 template <
typename T, std::
size_t NDIM>
370 if (world.rank()==0) {
371 timer_accumulate.print(
"accumulate");
372 timer_target_driven.print(
"target_driven");
373 timer_lr_result.print(
"result2low_rank");
377 template <
typename T, std::
size_t NDIM>
379 if (world.rank()==0) {
380 timer_accumulate.reset();
381 timer_target_driven.reset();
382 timer_lr_result.reset();
389 template <
typename T, std::
size_t NDIM>
394 if (world.rank() == coeffs.owner(cdata.key0)) {
395 if (is_compressed()) {
396 truncate_spawn(cdata.key0,tol);
398 truncate_reconstructed_spawn(cdata.key0,tol);
405 template <
typename T, std::
size_t NDIM>
414 template <
typename T, std::
size_t NDIM>
421 std::vector<Tensor<double> > localinfo_vec(1,localinfo);
422 std::vector<Tensor<double> > printinfo=world.gop.concat0(localinfo_vec);
426 if (world.rank()==0) do_print_plane(filename,printinfo,xaxis,yaxis,el2);
434 template <
typename T, std::
size_t NDIM>
437 user_to_sim<NDIM>(el2,x_sim);
447 const keyT& key = it->first;
448 const nodeT& node = it->second;
456 double scale=std::pow(0.5,
double(n));
457 double xloleft =
scale*l[xaxis];
458 double yloleft =
scale*l[yaxis];
459 double xhiright =
scale*(l[xaxis]+1);
460 double yhiright =
scale*(l[yaxis]+1);
471 if ((user[0]<-5.0) or (user[1]<-5.0) or (user[2]>5.0) or (user[3]>5.0))
continue;
477 const double maxrank=40;
483 const int npt = cdata.npt + 1;
494 plotinfo(counter,0)=color;
495 plotinfo(counter,1)=user[0];
496 plotinfo(counter,2)=user[1];
497 plotinfo(counter,3)=user[2];
498 plotinfo(counter,4)=user[3];
505 else plotinfo=plotinfo(
Slice(0,counter-1),
Slice(_));
510 template <
typename T, std::
size_t NDIM>
512 const int xaxis,
const int yaxis,
const coordT el2) {
519 pFile = fopen(filename.c_str(),
"w");
523 fprintf(pFile,
"\\psset{unit=1cm}\n");
524 fprintf(pFile,
"\\begin{pspicture}(%4.2f,%4.2f)(%4.2f,%4.2f)\n",
527 fprintf(pFile,
"\\pslinewidth=0.1pt\n");
529 for (std::vector<
Tensor<double> >::const_iterator it=plotinfo.begin(); it!=plotinfo.end(); ++it) {
534 for (
long i=0; i<localinfo.
dim(0); ++i) {
536 fprintf(pFile,
"\\newhsbcolor{mycolor}{%8.4f 1.0 0.7}\n",localinfo(i,0));
537 fprintf(pFile,
"\\psframe["
540 "(%12.8f,%12.8f)(%12.8f,%12.8f)\n",
541 localinfo(i,1),localinfo(i,2),localinfo(i,3),localinfo(i,4));
547 fprintf(pFile,
"\\end{pspicture}\n");
553 template <
typename T, std::
size_t NDIM>
557 std::vector<keyT> local_keys=local_leaf_keys();
560 std::vector<keyT> all_keys=world.gop.concat0(local_keys);
564 if (world.rank()==0) do_print_grid(filename,all_keys);
569 template <
typename T, std::
size_t NDIM>
573 std::vector<keyT> keys(coeffs.size());
580 const keyT& key = it->first;
581 const nodeT& node = it->second;
582 if (node.
is_leaf()) keys[i++]=key;
595 template <
typename T, std::
size_t NDIM>
602 const size_t npt = qx.
dim(0);
605 long npoints=power<NDIM>(npt);
607 long nboxes=keys.size();
611 pFile = fopen(filename.c_str(),
"w");
613 fprintf(pFile,
"%ld\n",npoints*nboxes);
614 fprintf(pFile,
"%ld points per box and %ld boxes \n",npoints,nboxes);
617 typename std::vector<keyT>::const_iterator key_it=keys.begin();
618 for (key_it=keys.begin(); key_it!=keys.end(); ++key_it) {
620 const keyT& key=*key_it;
621 fprintf(pFile,
"# key: %8d",key.
level());
628 const double h = std::pow(0.5,
double(n));
635 for (
size_t i=0; i<npt; ++i) {
636 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
637 for (
size_t j=0; j<npt; ++j) {
638 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
639 for (
size_t k=0;
k<npt; ++
k) {
640 c[2] = cell(2,0) +
h*cell_width[2]*(l[2] + qx(
k));
646 fprintf(pFile,
"%18.12f %18.12f %18.12f\n",
c[0],
c[1],
c[2]);
666 template <
typename T, std::
size_t NDIM>
672 const int MAXLEVEL1 = 20;
673 const int MAXLEVEL2 = 10;
680 return tol*std::min(1.0,
pow(0.5,
double(std::min(key.
level(),MAXLEVEL1)))*
L);
684 return tol*std::min(1.0,
pow(0.25,
double(std::min(key.
level(),MAXLEVEL2)))*
L*
L);
701 const static double fac=1.0/std::pow(2,
NDIM*0.5);
705 return tol*std::min(1.0,
pow(0.5,
double(std::min(key.
level(),MAXLEVEL1)))*
L);
713 template <
typename T, std::
size_t NDIM>
715 std::vector<Slice> s(
NDIM);
717 for (std::size_t i=0; i<
NDIM; ++i)
718 s[i] = cdata.s[l[i]&1];
724 template <
typename T, std::
size_t NDIM>
726 const keyT& child,
const keyT& parent,
const coeffT& coeff)
const {
736 if (coeff.
dim(0)==2*
f->get_k()) result=coeff;
737 else if (coeff.
dim(0)==
f->get_k()) {
738 result(
f->cdata.s0)+=coeff;
747 const coeffT scoeff=
f->parent_to_child(coeff,parent,child);
748 result(
f->cdata.s0)+=scoeff;
756 template <
typename T, std::
size_t NDIM>
761 for (
typename dcT::iterator it= coeffs.begin(); it!=end; ++it) {
763 nodeT& node=it->second;
764 if (key.
level()>max_level) coeffs.erase(key);
767 this->undo_redundant(
true);
772 template <
typename T, std::
size_t NDIM>
786 template <
typename T, std::
size_t NDIM>
788 const std::vector<tensorT>&
c,
790 if (key == cdata.key0 && coeffs.owner(key)!=world.rank())
return;
793 std::unique_ptr<typename dcT::accessor[]> acc(
new typename dcT::accessor[
v.size()]);
794 for (
unsigned int i=0; i<
c.size(); i++) {
797 bool exists = !
v[i]->coeffs.insert(acc[i],key);
809 for (
unsigned int i=0; i<
v.size(); i++) {
810 done &= acc[i]->second.has_coeff();
815 std::vector<tensorT>
d(
v.size());
816 for (
unsigned int i=0; i<
v.size(); i++) {
817 if (acc[i]->second.has_coeff()) {
820 s(cdata.s0) = acc[i]->second.coeff().full_tensor();
821 acc[i]->second.clear_coeff();
823 acc[i]->second.set_has_children(
true);
829 const keyT& child = kit.key();
830 std::vector<Slice> cp = child_patch(child);
831 std::vector<tensorT> childc(
v.size());
832 for (
unsigned int i=0; i<
v.size(); i++) {
833 if (
d[i].size()) childc[i] =
copy(
d[i](cp));
835 woT::task(coeffs.owner(child), &implT::refine_to_common_level,
v, childc, child);
841 template <
typename T, std::
size_t NDIM>
843 if (world.size()> 1000)
846 box_interior[from] = ni;
850 template <
typename T, std::
size_t NDIM>
852 if (world.size() >= 1000)
854 for (
int i=0; i<world.size(); ++i)
855 box_leaf[i] = box_interior[i] == 0;
857 long nleaf=0, ninterior=0;
860 const nodeT& node = it->second;
866 this->send(0, &implT::put_in_box, world.rank(), nleaf, ninterior);
868 if (world.rank() == 0) {
869 for (
int i=0; i<world.size(); ++i) {
870 printf(
"load: %5d %8ld %8ld\n", i, box_leaf[i], box_interior[i]);
876 template <
typename T, std::
size_t NDIM>
882 template <
typename T, std::
size_t NDIM>
886 double test = 2*
lo*hi + hi*hi;
893 template <
typename T, std::
size_t NDIM>
896 coeffs.insert(acc,key);
897 nodeT& node = acc->second;
919 const keyT& child = kit.key();
920 if (
d.size() > 0) ss =
copy(
d(child_patch(child)));
922 woT::task(coeffs.owner(child), &implT::sum_down_spawn, child, ss);
927 if (
c.size() <= 0)
c =
coeffT(cdata.vk,targs);
939 template <
typename T, std::
size_t NDIM>
941 if (get_tensor_type()!=
TT_FULL && world.rank()==0)
942 print(
"WARNING: sum_down is numerically unstable for tensor type",get_tensor_type());
944 if (world.rank() == coeffs.owner(cdata.key0)) sum_down_spawn(cdata.key0,
coeffT());
945 if (fence) world.gop.fence();
949 template <
typename T, std::
size_t NDIM>
953 const std::pair<keyT,coeffT>& left,
954 const std::pair<keyT,coeffT>& center,
955 const std::pair<keyT,coeffT>& right) {
956 D->forward_do_diff1(
f,
this,key,left,center,right);
960 template <
typename T, std::
size_t NDIM>
964 const std::pair<keyT,coeffT>& left,
965 const std::pair<keyT,coeffT>& center,
966 const std::pair<keyT,coeffT>& right) {
967 D->do_diff1(
f,
this,key,left,center,right);
972 template <
typename T, std::
size_t NDIM>
974 typedef std::pair<keyT,coeffT> argT;
975 if (
D->parallel_submit_) {
976 D->submit_diff_tasks(
f,
this);
977 if (fence) world.gop.fence();
980 for (
const auto& [key, node]:
f->coeffs) {
981 if (node.has_coeff()) {
983 argT center(key,node.coeff());
985 world.taskq.add(*
this, &implT::do_diff1,
D,
f, key, left, center, right, TaskAttributes::hipri());
991 if (fence) world.gop.fence();
996 template <
typename T, std::
size_t NDIM>
1009 template <
typename T, std::
size_t NDIM>
1017 std::vector<long> vkhalf=std::vector<long>(
NDIM/2,cdata.vk[0]);
1044 template <
typename T, std::
size_t NDIM>
1051 if (ket_only)
return coeff_ket;
1054 coeffT val_ket=coeffs2values(key,coeff_ket);
1072 coeff_result=
coeffT(values2coeffs(key,val_ket2),this->get_tensor_args());
1077 val_ket=val_ket.
convert(get_tensor_args());
1079 coeff_result=values2coeffs(key,val_result);
1083 return coeff_result;
1088 template <
typename T, std::
size_t NDIM>
1092 const_cast<implT*
>(&
f)->flo_unary_op_node_inplace(
do_mapdim(map,*
this),fence);
1097 template <
typename T, std::
size_t NDIM>
1100 const_cast<implT*
>(&
f)->flo_unary_op_node_inplace(
do_mirror(mirrormap,*
this),fence);
1107 template <
typename T, std::
size_t NDIM>
1109 const std::vector<long>& mirror,
bool fence) {
1119 template <
typename T, std::
size_t NDIM>
1123 this->scale_inplace(0.5,
true);
1130 template <
typename T, std::
size_t NDIM>
1138 template <
typename T, std::
size_t NDIM>
1146 template <
typename T, std::
size_t NDIM>
1148 std::list<keyT> to_be_erased;
1149 for (
auto it=coeffs.begin(); it!=coeffs.end(); ++it) {
1150 const keyT& key=it->first;
1151 nodeT& node=it->second;
1153 if (key.
level()>n) to_be_erased.push_back(key);
1155 for (
auto& key : to_be_erased) coeffs.erase(key);
1162 template <
typename T, std::
size_t NDIM>
1165 flo_unary_op_node_inplace(
1183 template <
typename T, std::
size_t NDIM>
1191 template <
typename T, std::
size_t NDIM>
1212 template <
typename T, std::
size_t NDIM>
1220 template <
typename T, std::
size_t NDIM>
1232 template <
typename T, std::
size_t NDIM>
1238 const tensorT h[2] = {cdata.h0T, cdata.h1T};
1246 for (
size_t ii=0; ii<
NDIM; ++ii) matrices[ii]=
h[kit.key().translation()[ii]%2];
1262 template <
typename T, std::
size_t NDIM>
1267 const tensorT h[2] = {cdata.h0, cdata.h1};
1280 template <
typename T, std::
size_t NDIM>
1282 long kmin = std::min(cdata.k,old.
cdata.k);
1283 std::vector<Slice> s(
NDIM,
Slice(0,kmin-1));
1286 const keyT& key = it->first;
1287 const nodeT& node = it->second;
1291 coeffs.replace(key,
nodeT(
c,
false));
1301 template <
typename T, std::
size_t NDIM>
1303 return coeffs.probe(key) && coeffs.find(key).get()->second.has_children();
1306 template <
typename T, std::
size_t NDIM>
1308 return coeffs.probe(key) && (not coeffs.find(key).get()->second.has_children());
1312 template <
typename T, std::
size_t NDIM>
1314 for (
unsigned int i=0; i<
v.size(); ++i) {
1324 template <
typename T, std::
size_t NDIM>
1327 for (
typename dcT::iterator it=coeffs.begin(); it!=end; ++it) {
1328 it->second.set_norm_tree(0.0);
1329 it->second.set_dnorm_tree(NORM_TREE_UNCOMPUTED);
1330 it->second.set_snorm(0.0);
1331 it->second.set_dnorm(0.0);
1336 template <
typename T, std::
size_t NDIM>
1339 for (
typename dcT::iterator it=coeffs.begin(); it!=end; ++it) {
1340 const keyT& key = it->first;
1342 const auto found = coeffs.find(acc,key);
1344 nodeT& node = acc->second;
1352 int ndir =
static_cast<int>(std::pow(
static_cast<double>(3),
static_cast<int>(
NDIM)));
1353 std::vector< Future <bool> >
v = future_vector_factory<bool>(ndir);
1358 for (std::size_t
d=0;
d<
NDIM; ++
d) {
1366 keyT neigh = neighbor(key,
keyT(key.
level(),l), is_periodic);
1368 if (neigh.is_valid()) {
1369 v[i++] = this->
task(coeffs.owner(neigh), &implT::exists_and_has_children, neigh);
1375 woT::task(world.rank(), &implT::broaden_op, key,
v);
1387 template <
typename T, std::
size_t NDIM>
1390 if (world.rank() == coeffs.owner(cdata.key0))
1391 woT::task(world.rank(), &implT::trickle_down_op, cdata.key0,
coeffT());
1392 if (fence) world.gop.fence();
1398 template <
typename T, std::
size_t NDIM>
1409 if (it == coeffs.end()) {
1411 it = coeffs.find(key).get();
1413 nodeT& node = it->second;
1423 if (key.
level() > 0)
d += s;
1426 const keyT& child = kit.key();
1430 woT::task(coeffs.owner(child), &implT::trickle_down_op, child, ss);
1440 template <
typename T, std::
size_t NDIM>
1444 if (current_state==finalstate)
return;
1450 if (finalstate==reconstructed) {
1452 else if (current_state==nonstandard)
reconstruct(fence);
1454 else if (current_state==nonstandard_with_leaves) {
1455 remove_internal_coefficients(fence);
1456 set_tree_state(reconstructed);
1458 else if (current_state==redundant) {
1459 remove_internal_coefficients(fence);
1460 set_tree_state(reconstructed);
1462 else if (current_state==redundant_after_merge) {
1464 set_tree_state(reconstructed);
1466 else if (current_state==redundant_after_merge) sum_down(fence);
1468 set_tree_state(reconstructed);
1469 }
else if (finalstate==compressed) {
1470 if (current_state==reconstructed) compress(compressed,fence);
1471 if (current_state==nonstandard) standard(fence);
1472 if (current_state==nonstandard_with_leaves) standard(fence);
1473 }
else if (finalstate==nonstandard) {
1474 if (current_state==reconstructed)
compress(nonstandard,fence);
1475 if (current_state==nonstandard_with_leaves) {
1476 remove_leaf_coefficients(fence);
1477 set_tree_state(nonstandard);
1479 }
else if (finalstate==nonstandard_with_leaves) {
1480 if (current_state==reconstructed) compress(nonstandard_with_leaves,fence);
1481 }
else if (finalstate==redundant) {
1496 static std::atomic<bool> reported(
false);
1497 if (not reported.exchange(
true))
1498 print(
"change_tree_state:", current_state,
"->", finalstate,
1499 "must reconstruct first and therefore fences, despite fence=false");
1508 template <
typename T, std::
size_t NDIM>
1511 if (is_reconstructed())
return;
1513 if (is_redundant() or is_nonstandard_with_leaves()) {
1515 this->remove_internal_coefficients(fence);
1516 }
else if (is_compressed() or tree_state==nonstandard_after_apply) {
1518 set_tree_state(reconstructed);
1519 if (world.rank() == coeffs.owner(cdata.key0))
1520 woT::task(world.rank(), &implT::reconstruct_op, cdata.key0,
coeffT(),
true);
1521 }
else if (is_nonstandard()) {
1524 if (world.rank() == coeffs.owner(cdata.key0))
1525 woT::task(world.rank(), &implT::reconstruct_op, cdata.key0,coeffT(),
false);
1529 if (fence) world.gop.fence();
1540 template <
typename T, std::
size_t NDIM>
1544 set_tree_state(newstate);
1549 if (world.rank() == coeffs.owner(cdata.key0)) {
1551 compress_spawn(cdata.key0, nonstandard1, keepleaves1, redundant1);
1557 template <
typename T, std::
size_t NDIM>
1562 template <
typename T, std::
size_t NDIM>
1568 template <
typename T, std::
size_t NDIM>
1572 if (is_redundant())
return;
1573 MADNESS_CHECK_THROW(is_reconstructed(),
"impl::make_redundant() wants a reconstructed tree");
1578 template <
typename T, std::
size_t NDIM>
1581 set_tree_state(reconstructed);
1582 flo_unary_op_node_inplace(remove_internal_coeffs(),fence);
1587 template <
typename T, std::
size_t NDIM>
1589 if (world.rank() == coeffs.owner(cdata.key0))
1590 norm_tree_spawn(cdata.key0);
1595 template <
typename T, std::
size_t NDIM>
1601 double value =
v[i].get();
1605 coeffs.task(key, &nodeT::set_norm_tree,
sum);
1610 template <
typename T, std::
size_t NDIM>
1612 nodeT& node = coeffs.find(key).get()->second;
1614 std::vector< Future<double> >
v = future_vector_factory<double>(1<<
NDIM);
1617 v[i] = woT::task(coeffs.owner(kit.key()), &implT::norm_tree_spawn, kit.key());
1619 return woT::task(world.rank(),&implT::norm_tree_op, key,
v);
1633 template <
typename T, std::
size_t NDIM>
1636 nodeT& node = coeffs.find(key).get()->second;
1639 if (not node.has_children())
return Future<coeffT>(node.coeff());
1643 std::vector<Future<coeffT> >
v = future_vector_factory<coeffT>(1<<
NDIM);
1646 v[i] = woT::task(coeffs.owner(kit.key()), &implT::truncate_reconstructed_spawn, kit.key(),tol,TaskAttributes::hipri());
1650 return woT::task(world.rank(),&implT::truncate_reconstructed_op,key,
v,tol,TaskAttributes::hipri());
1657 template <
typename T, std::
size_t NDIM>
1664 for (
size_t i=0; i<
v.size(); ++i)
if (
v[i].get().has_no_data())
return coeffT();
1671 const auto found = coeffs.find(acc, key);
1677 d(child_patch(kit.key())) +=
v[i].get().full_tensor();
1683 const double error=
d.normf();
1685 nodeT& node = coeffs.find(key).get()->second;
1687 if (
error < truncate_tol(tol,key)) {
1688 node.set_has_children(
false);
1690 coeffs.erase(kit.key());
1693 coeffT ss=coeffT(s,targs);
1694 acc->second.set_coeff(ss);
1707 template <
typename T, std::
size_t NDIM>
1717 double norm_tree2=0.0, dnorm_tree2=0.0;
1720 d(child_patch(kit.key())) +=
v[i].get().first.full_tensor();
1721 norm_tree2+=
v[i].get().second.first*
v[i].get().second.first;
1722 dnorm_tree2+=
v[i].get().second.second*
v[i].get().second.second;
1727 timer_filter.accumulate(cpu1-cpu0);
1731 const auto found = coeffs.find(acc, key);
1733 MADNESS_CHECK_THROW(!acc->second.has_coeff(),
"compress_op: existing coeffs where there should be none");
1743 double snorm = ss.
normf();
1749 const bool stored_tensor_keeps_s0 = (key.
level() == 0) or nonstandard1;
1751 const double dnorm =
d.normf();
1752 if (stored_tensor_keeps_s0)
d(cdata.s0) = s0block;
1757 double dnorm_tree=sqrt(dnorm_tree2+dnorm*dnorm);
1759 acc->second.set_snorm(snorm);
1760 acc->second.set_dnorm(dnorm);
1762 acc->second.set_dnorm_tree(dnorm_tree);
1764 acc->second.set_coeff(dd);
1766 timer_compress_svd.accumulate(cpu1-cpu0);
1769 return std::make_pair(ss,std::make_pair(
norm_tree,dnorm_tree));
1778 template <
typename T, std::
size_t NDIM>
1784 double norm_tree2=0.0, dnorm_tree2=0.0;
1786 d(child_patch(kit.key())) +=
v[i].get().first.full_tensor();
1787 norm_tree2+=
v[i].get().second.first*
v[i].get().second.first;
1788 dnorm_tree2+=
v[i].get().second.second*
v[i].get().second.second;
1800 double dnorm=
d.normf();
1801 double snorm=s.normf();
1804 const auto found = coeffs.find(acc, key);
1808 double dnorm_tree=sqrt(dnorm_tree2+dnorm*dnorm);
1810 acc->second.set_coeff(s);
1811 acc->second.set_dnorm(dnorm);
1812 acc->second.set_snorm(snorm);
1814 acc->second.set_dnorm_tree(dnorm_tree);
1817 return std::make_pair(s,std::make_pair(
norm_tree,dnorm_tree));
1821 template <
typename T, std::
size_t NDIM>
1824 if (is_compressed())
return;
1826 flo_unary_op_node_inplace(
do_standard(
this),fence);
1834 template <
typename T, std::
size_t NDIM>
1836 bool print_timings=
false;
1837 bool printme=(world.rank()==0 and print_timings);
1844 if (printme) printf(
"time in consolidate_buffer %8.4f\n",end1-begin1);
1852 if (printme) printf(
"time in do_reduce_rank %8.4f\n",end1-begin1);
1858 if (printme) printf(
"time in do_change_tensor_type %8.4f\n",end1-begin1);
1864 if (printme) printf(
"time in do_truncate_NS_leafs %8.4f\n",end1-begin1);
1867 double elapsed=end-begin;
1877 template <
typename T, std::
size_t NDIM>
1880 flo_unary_op_node_inplace(do_consolidate_buffer(get_tensor_args()),
true);
1882 set_tree_state(reconstructed);
1886 template <
typename T, std::
size_t NDIM>
1890 "norm2sq_local() needs a tree that holds its coefficients once");
1892 return world.taskq.reduce<double,
rangeT,do_norm2sq_local>(
rangeT(coeffs.begin(),coeffs.end()),
1893 do_norm2sq_local(has_coefficients_on_leaves_only()));
1900 template <
typename T, std::
size_t NDIM>
1902 std::size_t maxdepth = 0;
1905 std::size_t
N = (std::size_t) it->first.level();
1914 template <
typename T, std::
size_t NDIM>
1916 std::size_t maxdepth = max_local_depth();
1917 world.gop.max(maxdepth);
1922 template <
typename T, std::
size_t NDIM>
1924 std::size_t maxsize = 0;
1925 maxsize = coeffs.
size();
1926 world.gop.max(maxsize);
1931 template <
typename T, std::
size_t NDIM>
1933 std::size_t minsize = 0;
1934 minsize = coeffs.
size();
1935 world.gop.min(minsize);
1940 template <
typename T, std::
size_t NDIM>
1942 std::size_t
sum = 0;
1949 template <
typename T, std::
size_t NDIM>
1951 std::size_t
sum = 0;
1952 for (
const auto& [key,node] : coeffs) {
1953 if (node.has_coeff())
sum+=node.
size();
1959 template <
typename T, std::
size_t NDIM>
1961 std::size_t
sum = size_local();
1967 template <
typename T, std::
size_t NDIM>
1972 const nodeT& node = it->second;
1980 template <
typename T, std::
size_t NDIM>
1983 for (
auto& [key,node] : coeffs) {
1984 if (node.has_coeff())
sum+=node.coeff().
nCoeff();
1990 template <
typename T, std::
size_t NDIM>
1992 std::size_t
sum = nCoeff_local();
1999 template <
typename T, std::
size_t NDIM>
2001 const size_t tsize=this->tree_size();
2003 const size_t ncoeff=this->nCoeff();
2005 const double d=
sizeof(T);
2006 const double fac=1024*1024*1024;
2012 const bool norm_is_meaningful = has_summable_coefficients();
2014 if (norm_is_meaningful) {
2015 double local = norm2sq_local();
2016 this->world.gop.sum(local);
2017 this->world.gop.fence();
2021 if (this->world.rank()==0) {
2022 std::ostringstream oss;
2023 oss << std::setw(40) <<
name <<
" at time "
2024 << std::fixed << std::setprecision(1) << wall
2025 <<
"s: norm/tree/#coeff/size: ";
2026 if (norm_is_meaningful)
2027 oss << std::setw(7) << std::setprecision(5) <<
norm;
2029 oss << std::setw(7) <<
"n/a";
2031 <<
", " << std::setw(6) << std::setprecision(3) << double(ncoeff)*1.e-6
2032 <<
" m, " << std::setw(6) << std::setprecision(3) << double(ncoeff)/fac*
d
2039 template <
typename T, std::
size_t NDIM>
2041 if (this->targs.tt==
TT_FULL)
return;
2044 if (is_compressed())
k0=2*
k;
2049 if (world.rank()==0)
print(
"n.size(),k0,dim",n.
size(),
k0,dim);
2052 const nodeT& node = it->second;
2068 if (world.rank()==0) {
2069 print(
"configurations number of nodes");
2070 print(
" full rank ",n_full);
2071 for (
unsigned int i=0; i<n.
size(); i++) {
2072 print(
" ",i,
" ",n[i]);
2074 print(
" large rank ",n_large);
2079 for (
unsigned int i=0; i<std::min(3l,n.
size()); i++) nlog[0]+=n[i];
2080 for (
unsigned int i=3; i<std::min(10l,n.
size()); i++) nlog[1]+=n[i];
2081 for (
unsigned int i=10; i<std::min(30l,n.
size()); i++) nlog[2]+=n[i];
2082 for (
unsigned int i=30; i<std::min(100l,n.
size()); i++) nlog[3]+=n[i];
2083 for (
unsigned int i=100; i<std::min(300l,n.
size()); i++) nlog[4]+=n[i];
2084 for (
unsigned int i=300; i<std::min(1000l,n.
size()); i++) nlog[5]+=n[i];
2086 std::vector<std::string> slog={
"3",
"10",
"30",
"100",
"300",
"1000"};
2087 for (
unsigned int i=0; i<nlog.
size(); i++) {
2088 print(
" < ",slog[i],
" ",nlog[i]);
2090 print(
" large rank ",n_large);
2095 template <
typename T, std::
size_t NDIM>
2098 const int k = cdata.k;
2115 if constexpr (
NDIM <= 2) {
2117 double px[
NDIM][MAXK];
2120 if constexpr (
NDIM == 1) {
2121 const T* cp =
c.ptr();
2122 for (
int p=0;
p<
k; ++
p)
sum += cp[
p]*px[0][
p];
2125 for (
int p=0;
p<
k; ++
p) {
2126 const double a = px[0][
p];
2127 const T* cq = &
c(
p,0);
2129 for (
int q=0;
q<
k; ++
q) s2 += cq[
q]*px[1][
q];
2136 thread_local int phi_k = -1;
2138 for (std::size_t i=0; i<NDIM; ++i) phi[i] = Tensor<double>(
long(
k), 1L);
2141 for (std::size_t i=0; i<
NDIM; ++i)
2146 auto [ws, res] = madness::detail::eval_scratch<evalR>(
c.size());
2152 thread_local double cached_cell_volume = -1.0;
2153 thread_local double cached_inv_sqrt_cell_vol = 0.0;
2157 cached_inv_sqrt_cell_vol = 1.0/std::sqrt(
cell_volume);
2159 return sum * std::exp2(0.5*
NDIM*n) * cached_inv_sqrt_cell_vol;
2162 template <
typename T, std::
size_t NDIM>
2174 if (it == coeffs.end()) {
2176 it = coeffs.find(key).get();
2178 nodeT& node = it->second;
2189 if (!
d.has_data())
d =
coeffT(cdata.v2k,targs);
2190 if (accumulate_NS and (key.
level() > 0))
d(cdata.s0) += s;
2191 if (
d.dim(0)==2*get_k()) {
2196 const keyT& child = kit.key();
2200 woT::task(coeffs.owner(child), &implT::reconstruct_op, child, ss, accumulate_NS);
2210 if (s.has_no_data()) ss=
coeffT(cdata.vk,targs);
2216 template <
typename T, std::
size_t NDIM>
2219 std::vector<long> npt(
NDIM,qx.
dim(0));
2225 template <
typename T, std::
size_t NDIM>
2228 std::vector<long> npt(
NDIM,qx.
dim(0));
2234 template <
typename T, std::
size_t NDIM>
2243 const double h = std::pow(0.5,
double(n));
2245 const int npt = qx.
dim(0);
2252 for (std::size_t i = 0; i <
NDIM; i++) {
2253 c1[i] = cell(i,0) +
h*cell_width[i]*(l[i] + qx((
long)0));
2254 c2[i] = cell(i,0) +
h*cell_width[i]*(l[i] + qx(npt-1));
2256 if (
f.screened(c1, c2)) {
2262 bool vectorized =
f.supports_vectorized();
2264 T* fvptr = fval.
ptr();
2266 double* x1 =
new double[npt];
2268 for (
int i=0; i<npt; ++i, ++idx) {
2269 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2273 f(xvals, fvptr, npt);
2276 else if (
NDIM == 2) {
2277 double* x1 =
new double[npt*npt];
2278 double* x2 =
new double[npt*npt];
2280 for (
int i=0; i<npt; ++i) {
2281 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2282 for (
int j=0; j<npt; ++j, ++idx) {
2283 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2289 f(xvals, fvptr, npt*npt);
2293 else if (
NDIM == 3) {
2294 double* x1 =
new double[npt*npt*npt];
2295 double* x2 =
new double[npt*npt*npt];
2296 double* x3 =
new double[npt*npt*npt];
2298 for (
int i=0; i<npt; ++i) {
2299 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2300 for (
int j=0; j<npt; ++j) {
2301 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2302 for (
int k=0;
k<npt; ++
k, ++idx) {
2303 c[2] = cell(2,0) +
h*cell_width[2]*(l[2] + qx(
k));
2311 f(xvals, fvptr, npt*npt*npt);
2316 else if (
NDIM == 4) {
2317 double* x1 =
new double[npt*npt*npt*npt];
2318 double* x2 =
new double[npt*npt*npt*npt];
2319 double* x3 =
new double[npt*npt*npt*npt];
2320 double* x4 =
new double[npt*npt*npt*npt];
2322 for (
int i=0; i<npt; ++i) {
2323 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2324 for (
int j=0; j<npt; ++j) {
2325 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2326 for (
int k=0;
k<npt; ++
k) {
2327 c[2] = cell(2,0) +
h*cell_width[2]*(l[2] + qx(
k));
2328 for (
int m=0;
m<npt; ++
m, ++idx) {
2329 c[3] = cell(3,0) +
h*cell_width[3]*(l[3] + qx(
m));
2339 f(xvals, fvptr, npt*npt*npt*npt);
2345 else if (
NDIM == 5) {
2346 double* x1 =
new double[npt*npt*npt*npt*npt];
2347 double* x2 =
new double[npt*npt*npt*npt*npt];
2348 double* x3 =
new double[npt*npt*npt*npt*npt];
2349 double* x4 =
new double[npt*npt*npt*npt*npt];
2350 double* x5 =
new double[npt*npt*npt*npt*npt];
2352 for (
int i=0; i<npt; ++i) {
2353 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2354 for (
int j=0; j<npt; ++j) {
2355 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2356 for (
int k=0;
k<npt; ++
k) {
2357 c[2] = cell(2,0) +
h*cell_width[2]*(l[2] + qx(
k));
2358 for (
int m=0;
m<npt; ++
m) {
2359 c[3] = cell(3,0) +
h*cell_width[3]*(l[3] + qx(
m));
2360 for (
int n=0; n<npt; ++n, ++idx) {
2361 c[4] = cell(4,0) +
h*cell_width[4]*(l[4] + qx(n));
2373 f(xvals, fvptr, npt*npt*npt*npt*npt);
2380 else if (
NDIM == 6) {
2381 double* x1 =
new double[npt*npt*npt*npt*npt*npt];
2382 double* x2 =
new double[npt*npt*npt*npt*npt*npt];
2383 double* x3 =
new double[npt*npt*npt*npt*npt*npt];
2384 double* x4 =
new double[npt*npt*npt*npt*npt*npt];
2385 double* x5 =
new double[npt*npt*npt*npt*npt*npt];
2386 double* x6 =
new double[npt*npt*npt*npt*npt*npt];
2388 for (
int i=0; i<npt; ++i) {
2389 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2390 for (
int j=0; j<npt; ++j) {
2391 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2392 for (
int k=0;
k<npt; ++
k) {
2393 c[2] = cell(2,0) +
h*cell_width[2]*(l[2] + qx(
k));
2394 for (
int m=0;
m<npt; ++
m) {
2395 c[3] = cell(3,0) +
h*cell_width[3]*(l[3] + qx(
m));
2396 for (
int n=0; n<npt; ++n) {
2397 c[4] = cell(4,0) +
h*cell_width[4]*(l[4] + qx(n));
2398 for (
int p=0;
p<npt; ++
p, ++idx) {
2399 c[5] = cell(5,0) +
h*cell_width[5]*(l[5] + qx(
p));
2412 Vector<double*,6> xvals {x1, x2, x3, x4, x5, x6};
2413 f(xvals, fvptr, npt*npt*npt*npt*npt*npt);
2431 for (
int i=0; i<npt; ++i) {
2432 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2437 else if (
NDIM == 2) {
2438 for (
int i=0; i<npt; ++i) {
2439 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2440 for (
int j=0; j<npt; ++j) {
2441 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2447 else if (
NDIM == 3) {
2448 for (
int i=0; i<npt; ++i) {
2449 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2450 for (
int j=0; j<npt; ++j) {
2451 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2452 for (
int k=0;
k<npt; ++
k) {
2453 c[2] = cell(2,0) +
h*cell_width[2]*(l[2] + qx(
k));
2460 else if (
NDIM == 4) {
2461 for (
int i=0; i<npt; ++i) {
2462 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2463 for (
int j=0; j<npt; ++j) {
2464 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2465 for (
int k=0;
k<npt; ++
k) {
2466 c[2] = cell(2,0) +
h*cell_width[2]*(l[2] + qx(
k));
2467 for (
int m=0;
m<npt; ++
m) {
2468 c[3] = cell(3,0) +
h*cell_width[3]*(l[3] + qx(
m));
2469 fval(i,j,
k,
m) =
f(
c);
2476 else if (
NDIM == 5) {
2477 for (
int i=0; i<npt; ++i) {
2478 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2479 for (
int j=0; j<npt; ++j) {
2480 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2481 for (
int k=0;
k<npt; ++
k) {
2482 c[2] = cell(2,0) +
h*cell_width[2]*(l[2] + qx(
k));
2483 for (
int m=0;
m<npt; ++
m) {
2484 c[3] = cell(3,0) +
h*cell_width[3]*(l[3] + qx(
m));
2485 for (
int n=0; n<npt; ++n) {
2486 c[4] = cell(4,0) +
h*cell_width[4]*(l[4] + qx(n));
2487 fval(i,j,
k,
m,n) =
f(
c);
2495 else if (
NDIM == 6) {
2496 for (
int i=0; i<npt; ++i) {
2497 c[0] = cell(0,0) +
h*cell_width[0]*(l[0] + qx(i));
2498 for (
int j=0; j<npt; ++j) {
2499 c[1] = cell(1,0) +
h*cell_width[1]*(l[1] + qx(j));
2500 for (
int k=0;
k<npt; ++
k) {
2501 c[2] = cell(2,0) +
h*cell_width[2]*(l[2] + qx(
k));
2502 for (
int m=0;
m<npt; ++
m) {
2503 c[3] = cell(3,0) +
h*cell_width[3]*(l[3] + qx(
m));
2504 for (
int n=0; n<npt; ++n) {
2505 c[4] = cell(4,0) +
h*cell_width[4]*(l[4] + qx(n));
2506 for (
int p=0;
p<npt; ++
p) {
2507 c[5] = cell(5,0) +
h*cell_width[5]*(l[5] + qx(
p));
2508 fval(i,j,
k,
m,n,
p) =
f(
c);
2523 template <
typename T, std::
size_t NDIM>
2529 template <
typename T, std::
size_t NDIM>
2541 template <
typename T, std::
size_t NDIM>
2546 if (do_refine && key.
level() < max_refine_level) {
2549 std::vector<Vector<double,NDIM> > newspecialpts;
2550 if (key.
level() < special_level && specialpts.size() > 0) {
2552 const auto bperiodic = bc.is_periodic();
2553 for (
unsigned int i = 0; i < specialpts.size(); ++i) {
2555 user_to_sim(specialpts[i], simpt);
2558 newspecialpts.push_back(specialpts[i]);
2561 newspecialpts.push_back(specialpts[i]);
2575 const keyT& child = it.key();
2576 r(child_patch(child)) =
project(child);
2580 if (truncate_on_project)
s0 =
copy(
d(cdata.s0));
2587 if (newspecialpts.size() > 0 || dnorm >=truncate_tol(
thresh,key.
level())) {
2590 const keyT& child = it.key();
2593 p = world.random_proc();
2596 p = coeffs.owner(child);
2599 woT::task(
p, &implT::project_refine_op, child, do_refine, newspecialpts);
2603 if (truncate_on_project) {
2605 coeffs.replace(key,
nodeT(s,
false));
2610 const keyT& child = it.key();
2612 coeffs.replace(child,
nodeT(s,
false));
2622 template <
typename T, std::
size_t NDIM>
2624 std::vector<long> v0(
NDIM,0
L);
2625 std::vector<long> v1(
NDIM,1L);
2628 if (is_compressed()) {
2629 if (world.rank() == coeffs.owner(cdata.key0)) {
2632 nodeT& node = it->second;
2643 for (
typename dcT::iterator it=coeffs.begin(); it!=coeffs.end(); ++it) {
2644 Level n = it->first.level();
2645 nodeT& node = it->second;
2653 node.
coeff()(s) += tt;
2660 if (fence) world.gop.fence();
2663 template <
typename T, std::
size_t NDIM>
2666 if (is_compressed()) initial_level = std::max(initial_level,1);
2667 if (coeffs.is_local(key)) {
2668 if (is_compressed()) {
2669 if (key.
level() == initial_level) {
2673 coeffs.replace(key,
nodeT(
coeffT(cdata.v2k,targs),
true));
2677 if (key.
level()<initial_level) {
2681 coeffs.replace(key,
nodeT(
coeffT(cdata.vk,targs),
false));
2685 if (key.
level() < initial_level) {
2687 insert_zero_down_to_initial_level(kit.key());
2694 template <
typename T, std::
size_t NDIM>
2698 if (it == coeffs.end()) {
2702 coeffs.replace(key,
nodeT());
2703 it = coeffs.find(key).get();
2705 nodeT& node = it->second;
2707 std::vector< Future<bool> >
v = future_vector_factory<bool>(1<<
NDIM);
2710 v[i] = woT::task(coeffs.owner(kit.key()), &implT::truncate_spawn, kit.key(), tol, TaskAttributes::generator());
2712 return woT::task(world.rank(),&implT::truncate_op, key, tol,
v);
2721 if (dnorm < truncate_tol(tol,key)) {
2730 template <
typename T, std::
size_t NDIM>
2734 for (
int i=0; i<(1<<
NDIM); ++i)
if (
v[i].get())
return true;
2735 nodeT& node = coeffs.find(key).get()->second;
2742 if (key.
level() > 1) {
2744 if (dnorm < truncate_tol(tol,key)) {
2749 coeffs.erase(kit.key());
2758 template <
typename T, std::
size_t NDIM>
2760 if (world.rank() == 0) do_print_tree(cdata.key0, os, maxlevel);
2762 if (world.rank() == 0) os.flush();
2767 template <
typename T, std::
size_t NDIM>
2770 if (it == coeffs.end()) {
2772 for (
int i=0; i<key.
level(); ++i) os <<
" ";
2773 os << key <<
" missing --> " << coeffs.owner(key) <<
"\n";
2776 const nodeT& node = it->second;
2777 for (
int i=0; i<key.
level(); ++i) os <<
" ";
2778 os << key <<
" " << node <<
" --> " << coeffs.owner(key) <<
"\n";
2781 do_print_tree(kit.key(),os,maxlevel);
2787 template <
typename T, std::
size_t NDIM>
2789 std::multimap<Level, std::tuple<tranT, std::string>>
data;
2790 if (world.rank() == 0) do_print_tree_json(cdata.key0,
data, maxlevel);
2792 if (world.rank() == 0) {
2793 for (
Level level = 0; level != maxlevel; ++level) {
2794 if (
data.count(level) == 0)
2799 os <<
"\"" << level <<
"\":{";
2800 os <<
"\"level\": " << level <<
",";
2801 os <<
"\"nodes\":{";
2802 auto range =
data.equal_range(level);
2803 for (
auto it = range.first; it != range.second; ++it) {
2804 os <<
"\"" << std::get<0>(it->second) <<
"\":"
2805 << std::get<1>(it->second);
2806 if (std::next(it) != range.second)
2818 template <
typename T, std::
size_t NDIM>
2821 if (it == coeffs.end()) {
2825 const nodeT& node = it->second;
2826 std::ostringstream oss;
2829 oss <<
",\"owner\": " << coeffs.owner(key) <<
"}";
2830 auto node_json_str = oss.str();
2834 do_print_tree_json(kit.key(),
data, maxlevel);
2840 template <
typename T, std::
size_t NDIM>
2843 if (world.rank() == 0) do_print_tree_graphviz(cdata.key0, os, maxlevel);
2845 if (world.rank() == 0) os.flush();
2849 template <
typename T, std::
size_t NDIM>
2853 static int64_t value(
const keyT& key) {
2855 for (int64_t j = 0; j <= key.
level()-1; ++j) {
2856 result += (1 << j*
NDIM);
2864 if (it != coeffs.end()) {
2865 const nodeT& node = it->second;
2868 os << uniqhash::value(key) <<
" -> " << uniqhash::value(kit.key()) <<
"\n";
2869 do_print_tree_graphviz(kit.key(),os,maxlevel);
2875 template <
typename T, std::
size_t NDIM>
2879 if (not functor)
MADNESS_EXCEPTION(
"FunctionImpl: project: confusion about function?",0);
2882 if (functor->provides_coeff())
return functor->coeff(key).full_tensor_copy();
2887 tensorT workq(cdata.vq,
false);
2896 template <
typename T, std::
size_t NDIM>
2898 if (coeffs.probe(key)) {
2899 return Future<double>(coeffs.find(key).get()->second.get_norm_tree());
2903 return woT::task(coeffs.owner(parent), &implT::get_norm_tree_recursive, parent, TaskAttributes::hipri());
2907 template <
typename T, std::
size_t NDIM>
2912 while (coeffs.is_local(curr)) {
2913 if (coeffs.probe(curr)) {
2914 const nodeT& node = coeffs.find(curr).get()->second;
2918 result.
set(std::pair<keyT,coeffT>(curr,node.
coeff()));
2922 result.
set(std::pair<keyT,coeffT>(curr,
coeffT()));
2934 template <
typename T, std::
size_t NDIM>
2938 if (coeffs.probe(key)) {
2939 const nodeT& node = coeffs.find(key).get()->second;
2941 if (node.has_coeff()) {
2942 result.
set(std::pair<keyT,coeffT>(key,node.coeff()));
2956 template <
typename T, std::
size_t NDIM>
2972 woT::task(owner, &implT::eval, x, key, ref, TaskAttributes::hipri());
2978 nodeT& node = it->second;
2984 for (std::size_t i=0; i<
NDIM; ++i) {
2985 double xi = x[i]*2.0;
2987 if (li == 2) li = 1;
2999 template <
typename T, std::
size_t NDIM>
3006 while (key.
level() <= maxlevel) {
3007 if (coeffs.owner(key) ==
me) {
3010 if (it != coeffs.end()) {
3011 nodeT& node = it->second;
3017 for (std::size_t i=0; i<
NDIM; ++i) {
3018 double xi = x[i]*2.0;
3020 if (li == 2) li = 1;
3026 return std::pair<bool,T>(
false,0.0);
3029 template <
typename T, std::
size_t NDIM>
3032 std::size_t npt,
Level maxlevel,
3033 std::pair<bool,T>* results) {
3049 bool have_cache =
false;
3053 for (std::size_t ip=0; ip<npt; ++ip) {
3054 results[ip] = std::pair<bool,T>(
false, T(0));
3059 for (std::size_t i=0; i<
NDIM; ++i) l[i] = 0;
3061 for (
Level nn=0; nn<nl; ++nn) {
3062 for (std::size_t i=0; i<
NDIM; ++i) {
3063 double xi = x[i]*2.0;
3065 if (li == 2) li = 1;
3072 for (std::size_t i=0; i<
NDIM; ++i)
same =
same && (l[i] == lc[i]);
3074 results[ip] = std::pair<bool,T>(
true, eval_cube(nl, x, cached_c));
3084 while (key.
level() <= maxlevel) {
3085 if (coeffs.owner(key) ==
me) {
3088 if (it != coeffs.end()) {
3089 nodeT& node = it->second;
3094 results[ip] = std::pair<bool,T>(
true,
3095 eval_cube(key.
level(), x, cached_c));
3100 for (std::size_t i=0; i<
NDIM; ++i) {
3101 double xi = x[i]*2.0;
3103 if (li == 2) li = 1;
3112 template <
typename T, std::
size_t NDIM>
3113 std::vector<std::pair<bool,T>>
3115 std::vector<std::pair<bool,T>> results(xin.size(), std::pair<bool,T>(
false,T(0)));
3116 eval_local_only(xin.data(), xin.size(), maxlevel, results.data());
3120 template <
typename T, std::
size_t NDIM>
3136 woT::task(owner, &implT::evaldepthpt, x, key, ref, TaskAttributes::hipri());
3142 nodeT& node = it->second;
3148 for (std::size_t i=0; i<
NDIM; ++i) {
3149 double xi = x[i]*2.0;
3151 if (li == 2) li = 1;
3162 template <
typename T, std::
size_t NDIM>
3178 woT::task(owner, &implT::evalR, x, key, ref, TaskAttributes::hipri());
3184 nodeT& node = it->second;
3190 for (std::size_t i=0; i<
NDIM; ++i) {
3191 double xi = x[i]*2.0;
3193 if (li == 2) li = 1;
3205 template <
typename T, std::
size_t NDIM>
3216 template <
typename T, std::
size_t NDIM>
3219 coeffT shalf=t(cdata.sh);
3222 sfull(cdata.sh)-=shalf;
3226 template <
typename T, std::
size_t NDIM>
3232 if (t.
rank()==0)
return;
3234 for (
long i=0; i<t.
rank(); ++i) {
3237 tnorm(
c, &lo1, &hi1);
3245 template <
typename A,
typename B>
3252 template <
typename T, std::
size_t NDIM>
3270 template <
typename T, std::
size_t NDIM>
3278 template <
typename T, std::
size_t NDIM>
3284 template <
typename T, std::
size_t NDIM>
3292template <
typename T, std::
size_t NDIM>
3298 template <
typename T, std::
size_t NDIM>
3304 template <
typename T, std::
size_t NDIM>
3309 template <
typename T, std::
size_t NDIM>
3314 template <
typename T, std::
size_t NDIM>
3319 for (
int mu=0;
mu<cdata.npt; ++
mu) {
3320 double xmu =
scale*(cdata.quad_x(
mu)+lc) - lp;
3323 for (
int i=0; i<
k; ++i) phi(i,
mu) =
p[i];
3328 template <
typename T, std::
size_t NDIM>
3338 coeffT result = fcube_for_mul<T>(child, parent, s);
3340 result =
transform(result,cdata.quad_phiw);
3346 template <
typename T, std::
size_t NDIM>
3350 "trace_local() needs a tree that holds its coefficients once");
3351 std::vector<long> v0(
NDIM,0);
3353 if (is_compressed()) {
3354 if (world.rank() == coeffs.owner(cdata.key0)) {
3356 if (it != coeffs.end()) {
3357 const nodeT& node = it->second;
3365 const bool leaves_only = has_coefficients_on_leaves_only();
3367 const keyT& key = it->first;
3368 const nodeT& node = it->second;
3389 }
else if (l >= two2n) {
3393 }
while (l >= two2n);
3402 return l >= 0 && l < two2n;
3408 template <
typename T, std::
size_t NDIM>
3417 return keyT::invalid();
3423 template <
typename T, std::
size_t NDIM>
3431 return keyT::invalid();
3437 template <
typename T, std::
size_t NDIM>
3441 typedef std::pair< Key<NDIM>,
coeffT > argT;
3444 woT::task(coeffs.owner(key), &implT::sock_it_to_me_too, key, result.
remote_ref(world), TaskAttributes::hipri());
3451 template <
typename T, std::
size_t NDIM>
3453 bool nonstandard1,
bool keepleaves,
bool redundant1) {
3454 if (!coeffs.probe(key))
print(
"missing node",key);
3458 nodeT& node = coeffs.find(key).get()->second;
3462 std::vector< Future<compressT> >
v = future_vector_factory<compressT>(1<<
NDIM);
3467 v[i] = woT::task(coeffs.owner(kit.key()), &implT::compress_spawn, kit.key(),
3468 nonstandard1, keepleaves, redundant1, TaskAttributes::hipri());
3470 if (redundant1)
return woT::task(world.rank(),&implT::make_redundant_op, key,
v);
3471 return woT::task(world.rank(),&implT::compress_op, key,
v, nonstandard1);
3478 if (key.
level()==0) {
3491 coeffT sdcoeff(cdata.v2k,this->get_tensor_type());
3492 sdcoeff(cdata.s0)+=node.
coeff();
3518 node.
set_snorm(keepleaves ? snorm : 0.0);
3526 template <
typename T, std::
size_t NDIM>
3529 const coordT& plotlo,
const coordT& plothi,
const std::vector<long>& npt,
3530 bool eval_refine)
const {
3535 for (std::size_t i=0; i<
NDIM; ++i) {
3537 h[i] = (plothi[i]-plotlo[i])/(npt[i]-1);
3547 const double twon =
pow(2.0,
double(n));
3548 const tensorT& coeff = coeffs.find(key).get()->second.coeff().full_tensor();
3556 for (std::size_t
d=0;
d<
NDIM; ++
d) {
3559 boxhi[
d] = boxlo[
d]+fac;
3561 if (boxlo[
d] > plothi[
d] || boxhi[
d] < plotlo[
d]) {
3563 npttotal = boxnpt[
d] = 0;
3567 else if (npt[
d] == 1) {
3569 boxlo[
d] = boxhi[
d] = plotlo[
d];
3574 boxlo[
d] = std::max(boxlo[
d],plotlo[
d]);
3575 boxhi[
d] = std::min(boxhi[
d],plothi[
d]);
3578 double xlo = long((boxlo[
d]-plotlo[
d])/
h[
d])*
h[
d] + plotlo[
d];
3579 if (xlo < boxlo[
d]) xlo +=
h[
d];
3581 double xhi = long((boxhi[
d]-plotlo[
d])/
h[
d])*
h[
d] + plotlo[
d];
3582 if (xhi > boxhi[
d]) xhi -=
h[
d];
3585 boxnpt[
d] = long(round((boxhi[
d] - boxlo[
d])/
h[
d])) + 1;
3587 npttotal *= boxnpt[
d];
3592 for (std::size_t
d=0;
d<
NDIM; ++
d) {
3593 double xd = boxlo[
d] + it[
d]*
h[
d];
3594 x[
d] = twon*xd - l[
d];
3597 ind[
d] = long(round((xd-plotlo[
d])/
h[
d]));
3608 T tmp = eval_cube(n, x, coeff);
3618 template <
typename T, std::
size_t NDIM>
3621 const std::vector<long>& npt,
3622 const bool eval_refine)
const {
3630 const nodeT& node = it->second;
3631 if (node.has_coeff()) {
3632 woT::task(world.rank(), &implT::plot_cube_kernel,
3639 world.taskq.fence();
3647 fprintf(
f,
"%.6e\n",t);
3651 fprintf(
f,
"%.6e %.6e\n", t.real(), t.imag());
3654 template <
typename T, std::
size_t NDIM>
3656 const char* filename,
3658 const std::vector<long>& npt,
3668 "plotdx: plot cell must be an (NDIM x 2) [lo,hi] tensor "
3669 "(got an empty or ill-shaped cell)");
3670 const char* element[6] = {
"lines",
"quads",
"cubes",
"cubes4D",
"cubes5D",
"cubes6D"};
3675 if (world.
rank() == 0) {
3676 f = fopen(filename,
"w");
3679 fprintf(
f,
"object 1 class gridpositions counts ");
3680 for (std::size_t
d=0;
d<
NDIM; ++
d) fprintf(
f,
" %ld",npt[
d]);
3683 fprintf(
f,
"origin ");
3684 for (std::size_t
d=0;
d<
NDIM; ++
d) fprintf(
f,
" %.6e", cell(
d,0));
3687 for (std::size_t
d=0;
d<
NDIM; ++
d) {
3688 fprintf(
f,
"delta ");
3689 for (std::size_t
c=0;
c<
d; ++
c) fprintf(
f,
" 0");
3691 if (npt[
d]>1)
h = (cell(
d,1)-cell(
d,0))/(npt[
d]-1);
3692 fprintf(
f,
" %.6e",
h);
3693 for (std::size_t
c=
d+1;
c<
NDIM; ++
c) fprintf(
f,
" 0");
3698 fprintf(
f,
"object 2 class gridconnections counts ");
3699 for (std::size_t
d=0;
d<
NDIM; ++
d) fprintf(
f,
" %ld",npt[
d]);
3701 fprintf(
f,
"attribute \"element type\" string \"%s\"\n", element[
NDIM-1]);
3702 fprintf(
f,
"attribute \"ref\" string \"positions\"\n");
3706 for (std::size_t
d=0;
d<
NDIM; ++
d) npoint *= npt[
d];
3707 const char* iscomplex =
"";
3709 const char* isbinary =
"";
3710 if (binary) isbinary =
"binary";
3711 fprintf(
f,
"object 3 class array type double %s rank 0 items %d %s data follows\n",
3712 iscomplex, npoint, isbinary);
3718 if (world.
rank() == 0) {
3722 fwrite((
void *) r.
ptr(),
sizeof(T), r.
size(),
f);
3733 fprintf(
f,
"object \"%s\" class field\n",filename);
3734 fprintf(
f,
"component \"positions\" value 1\n");
3735 fprintf(
f,
"component \"connections\" value 2\n");
3736 fprintf(
f,
"component \"data\" value 3\n");
3737 fprintf(
f,
"\nend\n");
3743 template <std::
size_t NDIM>
3749 max_refine_level = 30;
3754 truncate_on_project =
true;
3755 apply_randomize =
false;
3756 project_randomize =
false;
3759 cell = make_default_cell();
3760 recompute_cell_info();
3761 set_default_pmap(world);
3764 template <std::
size_t NDIM>
3767 return std::make_shared<LevelPmap< Key<NDIM> >>(world);
3771 template <std::
size_t NDIM>
3773 pmap = make_default_pmap(world);
3774 pmap_nproc = world.
nproc();
3778 template <std::
size_t NDIM>
3780 std::cout <<
"Function Defaults:" << std::endl;
3781 std::cout <<
" Dimension " <<
": " <<
NDIM << std::endl;
3782 std::cout <<
" k" <<
": " <<
k << std::endl;
3783 std::cout <<
" thresh" <<
": " <<
thresh << std::endl;
3784 std::cout <<
" initial_level" <<
": " << initial_level << std::endl;
3785 std::cout <<
" special_level" <<
": " << special_level << std::endl;
3786 std::cout <<
" max_refine_level" <<
": " << max_refine_level << std::endl;
3787 std::cout <<
" truncate_mode" <<
": " <<
truncate_mode << std::endl;
3788 std::cout <<
" refine" <<
": " <<
refine << std::endl;
3789 std::cout <<
" autorefine" <<
": " << autorefine << std::endl;
3790 std::cout <<
" debug" <<
": " <<
debug << std::endl;
3791 std::cout <<
" truncate_on_project" <<
": " << truncate_on_project << std::endl;
3792 std::cout <<
" apply_randomize" <<
": " << apply_randomize << std::endl;
3793 std::cout <<
" project_randomize" <<
": " << project_randomize << std::endl;
3794 std::cout <<
" bc" <<
": " << get_bc() << std::endl;
3795 std::cout <<
" tt" <<
": " << tt << std::endl;
3796 std::cout <<
" cell" <<
": " << cell << std::endl;
3799 template <
typename T, std::
size_t NDIM>
3800 const FunctionCommonData<T,NDIM>*
FunctionCommonData<T,NDIM>::data[MAXK] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
3803 template <std::
size_t NDIM>
int FunctionDefaults<NDIM>::k = 6;
3804 template <std::
size_t NDIM>
double FunctionDefaults<NDIM>::thresh = 1
e-4;
3805 template <std::
size_t NDIM>
int FunctionDefaults<NDIM>::initial_level = 2;
3806 template <std::
size_t NDIM>
int FunctionDefaults<NDIM>::special_level = 3;
3807 template <std::
size_t NDIM>
int FunctionDefaults<NDIM>::max_refine_level = 30;
3808 template <std::
size_t NDIM>
int FunctionDefaults<NDIM>::truncate_mode = 0;
3809 template <std::
size_t NDIM>
bool FunctionDefaults<NDIM>::refine =
true;
3810 template <std::
size_t NDIM>
bool FunctionDefaults<NDIM>::autorefine =
true;
3811 template <std::
size_t NDIM>
bool FunctionDefaults<NDIM>::debug =
false;
3812 template <std::
size_t NDIM>
bool FunctionDefaults<NDIM>::truncate_on_project =
true;
3813 template <std::
size_t NDIM>
bool FunctionDefaults<NDIM>::apply_randomize =
false;
3814 template <std::
size_t NDIM>
bool FunctionDefaults<NDIM>::project_randomize =
false;
3815 template <std::
size_t NDIM> std::optional<BoundaryConditions<NDIM>> FunctionDefaults<NDIM>::bc;
3816 template <std::
size_t NDIM> TensorType FunctionDefaults<NDIM>::tt = TT_FULL;
3817 template <std::
size_t NDIM> Tensor<double> FunctionDefaults<NDIM>::cell = FunctionDefaults<NDIM>::make_default_cell();
3818 template <std::
size_t NDIM> Tensor<double> FunctionDefaults<NDIM>::cell_width = FunctionDefaults<NDIM>::make_default_cell_width();
3819 template <std::
size_t NDIM> Tensor<double> FunctionDefaults<NDIM>::rcell_width = FunctionDefaults<NDIM>::make_default_cell_width();
3820 template <std::
size_t NDIM>
double FunctionDefaults<NDIM>::cell_volume = 1.;
3821 template <std::
size_t NDIM>
double FunctionDefaults<NDIM>::cell_min_width = 1.;
3822 template <std::
size_t NDIM>
double FunctionDefaults<NDIM>::cell_geometric_mean_width = 1.;
3823 template <std::
size_t NDIM> std::shared_ptr< WorldDCPmapInterface< Key<NDIM> > > FunctionDefaults<NDIM>::pmap;
3824 template <std::
size_t NDIM>
int FunctionDefaults<NDIM>::pmap_nproc{-1};
double w(double t, double eps)
Definition DKops.h:22
double q(double t)
Definition DKops.h:18
std::complex< double > double_complex
Definition cfft.h:14
Definition test_ar.cc:118
Definition test_ar.cc:141
Definition test_tree.cc:78
long dim(int i) const
Returns the size of dimension i.
Definition basetensor.h:147
long ndim() const
Returns the number of dimensions in the tensor.
Definition basetensor.h:144
long size() const
Returns the number of elements in the tensor.
Definition basetensor.h:138
This class is used to specify boundary conditions for all operators.
Definition bc.h:72
a class to track where relevant (parent) coeffs are
Definition funcimpl.h:826
Tri-diagonal operator traversing tree primarily for derivative operator.
Definition derivative.h:73
ElementaryInterface (formerly FunctorInterfaceWrapper) interfaces a c-function.
Definition function_interface.h:275
FunctionCommonData holds all Function data common for given k.
Definition function_common_data.h:52
FunctionDefaults holds default paramaters as static class members.
Definition funcdefaults.h:101
Abstract base class interface required for functors used as input to Functions.
Definition function_interface.h:68
Definition funcimpl.h:5733
FunctionImpl holds all Function state to facilitate shallow copy semantics.
Definition funcimpl.h:982
FunctionNode< Q, NDIM > nodeT
Type of node.
Definition funcimpl.h:992
const FunctionCommonData< T, NDIM > & cdata
Definition funcimpl.h:1021
std::size_t nCoeff() const
Returns the number of coefficients in the function ... collective global sum.
Definition mraimpl.h:1991
const std::shared_ptr< WorldDCPmapInterface< Key< NDIM > > > & get_pmap() const
Definition mraimpl.h:209
void flo_unary_op_node_inplace(const opT &op, bool fence)
Definition funcimpl.h:2356
dcT coeffs
The coefficients.
Definition funcimpl.h:1026
Range< typename dcT::const_iterator > rangeT
Definition funcimpl.h:5874
GenTensor< Q > coeffT
Type of tensor used to hold coeffs.
Definition funcimpl.h:993
const keyT & key0() const
Returns cdata.key0.
Definition mraimpl.h:406
std::pair< coeffT, std::pair< double, double > > compressT
s coefficients plus the (snorm_tree, dnorm_tree) pair propagated up by compress
Definition funcimpl.h:4834
std::size_t size() const
Returns the number of coefficients in the function ... collective global sum.
Definition mraimpl.h:1960
Key< NDIM > keyT
Type of key.
Definition funcimpl.h:991
FunctionNode holds the coefficients, etc., at each node of the 2^NDIM-tree.
Definition funcimpl.h:136
bool has_coeff() const
Returns true if there are coefficients in this node.
Definition funcimpl.h:210
void clear_coeff()
Clears the coefficients (has_coeff() will subsequently return false)
Definition funcimpl.h:305
bool is_leaf() const
Returns true if this does not have children.
Definition funcimpl.h:223
void set_has_children(bool flag)
Sets has_children attribute to value of flag.
Definition funcimpl.h:264
void scale_norms(const double a)
Multiply the stored norms by a, for coefficients scaled by some q with |q| = a.
Definition funcimpl.h:360
double get_norm_tree() const
Gets the value of norm_tree.
Definition funcimpl.h:326
void set_snorm(const double sn)
set the precomputed norm of the (virtual) s coefficients
Definition funcimpl.h:341
void set_is_leaf(bool flag)
Sets has_children attribute to value of !flag.
Definition funcimpl.h:290
void print_json(std::ostream &s) const
Definition funcimpl.h:499
void set_dnorm_tree(double dnorm_tree)
Sets the value of dnorm_tree.
Definition funcimpl.h:321
bool has_children() const
Returns true if this node has children.
Definition funcimpl.h:217
void set_coeff(const coeffT &coeffs)
Takes a shallow copy of the coeff — same as this->coeff()=coeff.
Definition funcimpl.h:295
void set_dnorm(const double dn)
set the precomputed norm of the (virtual) d coefficients
Definition funcimpl.h:346
coeffT & coeff()
Returns a non-const reference to the tensor containing the coeffs.
Definition funcimpl.h:237
void set_norm_tree(double norm_tree)
Sets the value of norm_tree.
Definition funcimpl.h:316
A multiresolution adaptive numerical function.
Definition mra.h:144
Implements the functionality of futures.
Definition future.h:75
A future is a possibly yet unevaluated value.
Definition future.h:370
remote_refT remote_ref(World &world) const
Returns a structure used to pass references to another process.
Definition future.h:672
void set(const Future< T > &other)
A.set(B), where A and B are futures ensures A has/will have the same value as B.
Definition future.h:505
RemoteReference< FutureImpl< T > > remote_refT
Definition future.h:395
Definition lowranktensor.h:59
GenTensor convert(const TensorArgs &) const
Definition gentensor.h:198
long dim(const int i) const
return the number of entries in dimension i
Definition lowranktensor.h:391
Tensor< T > full_tensor_copy() const
Definition gentensor.h:206
long ndim() const
Definition lowranktensor.h:386
constexpr bool is_full_tensor() const
Definition gentensor.h:224
void reduce_rank(const double &)
Definition gentensor.h:217
bool has_no_data() const
Definition gentensor.h:211
size_t real_size() const
Definition gentensor.h:214
GenTensor< T > & emul(const GenTensor< T > &other)
Inplace multiply by corresponding elements of argument Tensor.
Definition lowranktensor.h:637
float_scalar_type normf() const
Definition lowranktensor.h:406
long rank() const
Definition gentensor.h:212
const Tensor< T > & full_tensor() const
Definition gentensor.h:200
TensorType tensor_type() const
Definition gentensor.h:221
bool has_data() const
Definition gentensor.h:210
const long * dims() const
return the number of entries in dimension i
Definition lowranktensor.h:397
GenTensor & gaxpy(const T alpha, const GenTensor &other, const T beta)
Definition lowranktensor.h:586
IsSupported< TensorTypeData< Q >, GenTensor< T > & >::type scale(Q fac)
Inplace multiplication by scalar of supported type (legacy name)
Definition lowranktensor.h:426
constexpr bool is_svd_tensor() const
Definition gentensor.h:222
Iterates in lexical order thru all children of a key.
Definition key.h:548
Key is the index for a node of the 2^NDIM-tree.
Definition key.h:70
Level level() const
Definition key.h:169
bool is_neighbor_of(const Key &key, const array_of_bools< NDIM > &bperiodic) const
Assuming keys are at the same level, returns true if displaced by no more than 1 in any direction.
Definition key.h:325
bool thisKeyContains(const Vector< double, NDIM > &x, const unsigned int &dim0, const unsigned int &dim1) const
check if this MultiIndex contains point x, disregarding these two dimensions
Definition key.h:400
bool is_invalid() const
Checks if a key is invalid.
Definition key.h:119
Key parent(int generation=1) const
Returns the key of the parent.
Definition key.h:290
const Vector< Translation, NDIM > & translation() const
Definition key.h:174
Range, vaguely a la Intel TBB, to encapsulate a random-access, STL-like start and end iterator with c...
Definition range.h:64
Simple structure used to manage references/pointers to remote instances.
Definition worldref.h:394
double weights(const unsigned int &i) const
return the weight
Definition srconf.h:671
const Tensor< T > flat_vector(const unsigned int &idim) const
return shallow copy of a slice of one of the vectors, flattened to (r,kVec)
Definition srconf.h:545
Definition SVDTensor.h:42
long rank() const
Definition SVDTensor.h:77
A slice defines a sub-range or patch of a dimension.
Definition slice.h:103
Traits class to specify support of numeric types.
Definition type_data.h:56
A tensor is a multidimensional array.
Definition tensor.h:318
float_scalar_type normf() const
Returns the Frobenius norm of the tensor.
Definition tensor.h:1727
Tensor< T > & fill(T x)
Inplace fill with a scalar (legacy name)
Definition tensor.h:563
T sum() const
Returns the sum of all elements of the tensor.
Definition tensor.h:1663
T * ptr()
Returns a pointer to the internal data.
Definition tensor.h:1841
IsSupported< TensorTypeData< Q >, Tensor< T > & >::type scale(Q x)
Inplace multiplication by scalar of supported type (legacy name)
Definition tensor.h:687
Tensor< T > & emul(const Tensor< T > &t)
Inplace multiply by corresponding elements of argument Tensor.
Definition tensor.h:1800
bool has_data() const
Definition tensor.h:1903
iterator begin()
Returns an iterator to the beginning of the local data (no communication)
Definition worlddc.h:1549
implT::const_iterator const_iterator
Definition worlddc.h:1307
iterator end()
Returns an iterator past the end of the local data (no communication)
Definition worlddc.h:1563
Future< iterator > futureT
Definition worlddc.h:1310
implT::iterator iterator
Definition worlddc.h:1306
implT::accessor accessor
Definition worlddc.h:1308
void fence(bool debug=false)
Synchronizes all processes in communicator AND globally ensures no pending AM or tasks.
Definition worldgop.cc:177
A parallel world class.
Definition world.h:134
ProcessID rank() const
Returns the process rank in this World (same as MPI_Comm_rank()).
Definition world.h:344
WorldGopInterface & gop
Global operations.
Definition world.h:216
ProcessID nproc() const
Returns the number of processes in this World (same as MPI_Comm_size()).
Definition world.h:349
Wrapper for an opaque pointer for serialization purposes.
Definition archive.h:851
syntactic sugar for std::array<bool, N>
Definition array_of_bools.h:19
double(* f)(const coord_3d &)
Definition derivatives.cc:54
char * p(char *buf, const char *name, int k, int initial_level, double thresh, int order)
Definition derivatives.cc:72
static double lo
Definition dirac-hatom.cc:23
static bool debug
Definition dirac-hatom.cc:16
Fcwf copy(Fcwf psi)
Definition fcwf.cc:374
std::vector< Fcwf > transform(World &world, std::vector< Fcwf > &a, Tensor< std::complex< double > > U)
Definition fcwf.cc:515
Provides FunctionCommonData, FunctionImpl and FunctionFactory.
static double function(const coord_3d &r)
Normalized gaussian.
Definition functionio.cc:100
Tensor< TENSOR_RESULT_TYPE(T, Q) > & fast_transform(const Tensor< T > &t, const Tensor< Q > &c, Tensor< TENSOR_RESULT_TYPE(T, Q) > &result, Tensor< TENSOR_RESULT_TYPE(T, Q) > &workspace)
Restricted but heavily optimized form of transform()
Definition tensor.h:2460
Tensor< T > transpose(const Tensor< T > &t)
Returns a new deep copy of the transpose of the input tensor.
Definition tensor.h:2035
const double beta
Definition gygi_soltion.cc:62
static const double v
Definition hatom_sf_dirac.cc:20
Key< 6 > simpt2key(const Vector< double, 6 > &pt, Level n)
Returns the box at level n that contains the given point in simulation coordinates.
Definition helium_mp2.cc:468
Tensor< double > op(const Tensor< double > &x)
Definition kain.cc:508
static double pow(const double *a, const double *b)
Definition lda.h:74
Macros and tools pertaining to the configuration of MADNESS.
#define MADNESS_PRAGMA_CLANG(x)
Definition madness_config.h:200
#define MADNESS_CHECK(condition)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition madness_exception.h:182
#define MADNESS_EXCEPTION(msg, value)
Macro for throwing a MADNESS exception.
Definition madness_exception.h:119
#define MADNESS_ASSERT(condition)
Assert a condition that should be free of side-effects since in release builds this might be a no-op.
Definition madness_exception.h:134
#define MADNESS_CHECK_THROW(condition, msg)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition madness_exception.h:207
Tensor< double > tensorT
Definition mcpfit.cc:52
Vector< double, 3 > coordT
Definition mcpfit.cc:48
static double ttt
Definition mcpfit.cc:57
void print(const tensorT &t)
Definition mcpfit.cc:140
static const bool VERIFY_TREE
Definition mra.h:57
Definition potentialmanager.cc:41
Namespace for all elements and tools of MADNESS.
Definition DFConvergence.h:9
bool two_scale_hg(int k, Tensor< double > *hg)
Definition twoscale.cc:151
@ BC_FREE
Definition bc.h:53
void make_redundant(World &world, const std::vector< Function< T, NDIM > > &v, bool fence=true)
change tree_state of a vector of functions to redundant
Definition vmra.h:187
static bool enforce_in_volume(Level n, const Translation &l)
Definition mraimpl.h:3400
double abs(double x)
Definition complexfun.h:48
GenTensor< TENSOR_RESULT_TYPE(R, Q)> general_transform(const GenTensor< R > &t, const Tensor< Q > c[])
Definition gentensor.h:274
void legendre_scaling_functions(double x, long k, double *p)
Evaluate the first k Legendre scaling functions.
Definition legendre.cc:85
void norm_tree(World &world, const std::vector< Function< T, NDIM > > &v, bool fence=true)
Makes the norm tree for all functions in a vector.
Definition vmra.h:1345
TreeState
Definition funcdefaults.h:60
@ nonstandard_after_apply
s and d coeffs, state after operator application
Definition funcdefaults.h:65
@ on_demand
no coeffs anywhere, but a functor providing if necessary
Definition funcdefaults.h:68
@ redundant_after_merge
s coeffs everywhere, must be summed up to yield the result
Definition funcdefaults.h:67
@ reconstructed
s coeffs at the leaves only
Definition funcdefaults.h:61
@ nonstandard
s and d coeffs in internal nodes
Definition funcdefaults.h:63
@ unknown
Definition funcdefaults.h:69
@ compressed
d coeffs in internal nodes, s and d coeffs at the root, empty leaves may be present
Definition funcdefaults.h:62
@ redundant
s coeffs everywhere
Definition funcdefaults.h:66
@ nonstandard_with_leaves
like nonstandard, with s coeffs at the leaves
Definition funcdefaults.h:64
void compress(World &world, const std::vector< Function< T, NDIM > > &v, bool fence=true)
Compress a vector of functions.
Definition vmra.h:150
const std::vector< Function< T, NDIM > > & reconstruct(const std::vector< Function< T, NDIM > > &v)
reconstruct a vector of functions
Definition vmra.h:163
int64_t Translation
Definition key.h:58
Tensor< TENSOR_RESULT_TYPE(T, Q)> & general_fast_transform(const Tensor< T > &t, const Tensor< Q > *c, Tensor< TENSOR_RESULT_TYPE(T, Q)> &result, Tensor< TENSOR_RESULT_TYPE(T, Q)> &workspace)
Definition tensor.h:2564
void plotdx(const Function< T, NDIM > &f, const char *filename, const Tensor< double > &cell=FunctionDefaults< NDIM >::get_cell(), const std::vector< long > &npt=std::vector< long >(NDIM, 201L), bool binary=true)
Writes an OpenDX format file with a cube/slice of points on a uniform grid.
Definition mraimpl.h:3655
Function< T, NDIM > mirror(const Function< T, NDIM > &f, const std::vector< long > &mirrormap, bool fence=true)
Generate a new function by mirroring within the dimensions .. optional fence.
Definition mra.h:2520
int Level
Definition key.h:59
std::enable_if< std::is_base_of< ProjectorBase, projT >::value, OuterProjector< projT, projQ > >::type outer(const projT &p0, const projQ &p1)
Definition projector.h:457
TreeState get_tree_state(const Function< T, NDIM > &f)
get tree state of a function
Definition mra.h:2981
bool gauss_legendre(int n, double xlo, double xhi, double *x, double *w)
Definition legendre.cc:226
Tensor< T > fcube(const Key< NDIM > &, T(*f)(const Vector< double, NDIM > &), const Tensor< double > &)
Definition mraimpl.h:2217
TensorType
low rank representations of tensors (see gentensor.h)
Definition gentensor.h:120
@ TT_2D
Definition gentensor.h:120
@ TT_FULL
Definition gentensor.h:120
static void dxprintvalue(FILE *f, const double t)
Definition mraimpl.h:3646
void refine(World &world, const std::vector< Function< T, NDIM > > &vf, bool fence=true)
refine the functions according to the autorefine criteria
Definition vmra.h:197
const Function< T, NDIM > & change_tree_state(const Function< T, NDIM > &f, const TreeState finalstate, bool fence=true)
change tree state of a function
Definition mra.h:2994
double wall_time()
Returns the wall time in seconds relative to an arbitrary origin.
Definition timers.cc:48
void change_tensor_type(GenTensor< T > &, const TensorArgs &targs)
change representation to targ.tt
Definition gentensor.h:284
constexpr Vector< T, sizeof...(Ts)+1 > vec(T t, Ts... ts)
Factory function for creating a madness::Vector.
Definition vector.h:750
Function< T, NDIM > multiply(const Function< T, NDIM > f, const Function< T, LDIM > g, const int particle, const bool fence=true)
multiply a high-dimensional function with a low-dimensional function
Definition mra.h:2621
void scale(World &world, std::vector< Function< T, NDIM > > &v, const std::vector< Q > &factors, bool fence=true)
Scales inplace a vector of functions by distinct values.
Definition vmra.h:874
@ same
same atoms at the same places
std::string name(const FuncType &type, const int ex=-1)
Definition ccpairfunction.h:28
static bool enforce_bc(bool is_periodic, Level n, Translation &l)
Definition mraimpl.h:3380
bool isnan(const std::complex< T > &v)
Definition mraimpl.h:55
static long abs(long a)
Definition tensor.h:219
const double mu
Definition navstokes_cosines.cc:95
static const double b
Definition nonlinschro.cc:119
static const double d
Definition nonlinschro.cc:121
static const double a
Definition nonlinschro.cc:118
void error(const char *msg, int code)
Definition oldtest.cc:57
static const double c
Definition relops.cc:10
static const double m
Definition relops.cc:9
static const double L
Definition rk.cc:46
static const double thresh
Definition rk.cc:45
static const long k
Definition rk.cc:44
const double xi
Exponent for delta function approx.
Definition siam_example.cc:60
Definition test_ar.cc:204
Key parent() const
Definition test_tree.cc:68
Definition test_ccpairfunction.cc:22
add two functions f and g: result=alpha * f + beta * g
Definition funcimpl.h:3770
"put" this on g
Definition funcimpl.h:2781
change representation of nodes' coeffs to low rank, optional fence
Definition funcimpl.h:2814
check symmetry wrt particle exchange
Definition funcimpl.h:2487
compute the norm of the wavelet coefficients
Definition funcimpl.h:4667
Definition funcimpl.h:2841
Definition funcimpl.h:1600
mirror dimensions of this, write result on f
Definition funcimpl.h:2715
map this on f
Definition funcimpl.h:2635
mirror dimensions of this, write result on f
Definition funcimpl.h:2665
reduce the rank of the nodes, optional fence
Definition funcimpl.h:2461
Changes non-standard compressed form to standard compressed form.
Definition funcimpl.h:4891
given an NS tree resulting from a convolution, truncate leafs if appropriate
Definition funcimpl.h:2382
remove all coefficients of internal nodes
Definition funcimpl.h:2407
remove all coefficients of leaf nodes
Definition funcimpl.h:2424
Definition funcimpl.h:4739
shallow-copy, pared-down version of FunctionNode, for special purpose only
Definition funcimpl.h:784
TensorArgs holds the arguments for creating a LowRankTensor.
Definition gentensor.h:134
double thresh
Definition gentensor.h:135
Definition mraimpl.h:3279
void operator()(const Key< NDIM > &key, Tensor< T > &t) const
Definition mraimpl.h:3280
void serialize(Archive &ar)
Definition mraimpl.h:3281
Definition mraimpl.h:3285
void operator()(const Key< NDIM > &key, Tensor< T > &t) const
Definition mraimpl.h:3286
void serialize(Archive &ar)
Definition mraimpl.h:3287
Definition mraimpl.h:3246
void operator()(const A &a, const B &b) const
Definition mraimpl.h:3247
void serialize(Archive &ar)
Definition mraimpl.h:3249
Definition mraimpl.h:3253
void operator()(const Key< NDIM > &key, FunctionNode< T, NDIM > &node) const
Definition mraimpl.h:3261
void serialize(Archive &ar)
Definition mraimpl.h:3265
T q
Definition mraimpl.h:3254
scaleinplace()
Definition mraimpl.h:3255
scaleinplace(T q)
Definition mraimpl.h:3257
void operator()(const Key< NDIM > &key, Tensor< T > &t) const
Definition mraimpl.h:3258
Definition mraimpl.h:3271
void serialize(Archive &ar)
Definition mraimpl.h:3275
void operator()(const Key< NDIM > &key, Tensor< T > &t) const
Definition mraimpl.h:3272
insert/replaces the coefficients into the function
Definition funcimpl.h:727
Definition lowrankfunction.h:336
int np
Definition tdse1d.cc:165
double real(double a)
Definition tdse4.cc:78
static const double s0
Definition tdse4.cc:83
AtomicInt sum
Definition test_atomicint.cc:46
int me
Definition test_binsorter.cc:10
double norm(const T i1)
Definition test_cloud.cc:85
double cpu_time()
Definition test_list.cc:43
static Function< double, D > project(World &world, const std::shared_ptr< FunctionFunctorInterface< double, D > > &functor)
Definition test_mul_sparse.cc:72
int task(int i)
Definition test_runtime.cpp:4
void e()
Definition test_sig.cc:75
static double g1(const Vector< double, D > &r)
Definition test_state_archive_hdf5.cpp:34
static double g0(const Vector< double, D > &r)
Definition test_state_archive_hdf5.cpp:31
#define N
Definition testconv.cc:37
static const double alpha
Definition testcosine.cc:10
static const int truncate_mode
Definition testcosine.cc:14
double cell_volume()
Definition testgconv.cc:86
double g(const coord_t &r)
Definition testgconv.cc:116
constexpr std::size_t NDIM
Definition testgconv.cc:54
double h(const coord_1d &r)
Definition testgconv.cc:175
std::size_t axis
Definition testpdiff.cc:59
double k0
Definition testperiodic.cc:66
#define TENSOR_RESULT_TYPE(L, R)
This macro simplifies access to TensorResultType.
Definition type_data.h:205
Defines and implements WorldObject.
Implements WorldContainer.
Defines and implements a concurrent hashmap.
#define PROFILE_FUNC
Definition worldprofile.h:209
#define PROFILE_MEMBER_FUNC(classname)
Definition worldprofile.h:210
#define PROFILE_BLOCK(name)
Definition worldprofile.h:208
int ProcessID
Used to clearly identify process number/rank.
Definition worldtypes.h:43
Key< D > keyT
Definition writecoeff2.cc:11
void test()
Definition y.cc:696