void check(double ****f) //calculate energy of pulsations of all components and know if there's crash { int i,j,k,l; PulsEnergy=0; TotalEnergy=0; for(l=0;l<=2;l++) for(i=0;i<m1;i++) for(k=0;k<m3;k++) averf[l][i][k] = 0; for(i=ghost;i<mm1;i++) for(j=ghost;j<mm2;j++) for(k=ghost;k<mm3;k++) if(isType(node[i][k],NodeFluid) && !isType(node[i][k],NodeClued)) { PulsEnergy+=deviation(f,i,j,k); for(l=0;l<=2;l++) averf[l][i][k] += pow(f[l+1][i][j][k],2.); } for(l=1;l<=3;l++) for(i=0;i<m1;i++) for(k=0;k<m3;k++) if(isType(node[i][k],NodeFluid) && !isType(node[i][k],NodeClued)) TotalEnergy += fabs(1+coordin(i,0)*rc)*averf[l][i][k]; TotalEnergy += 1.; //if zero average field razlet = (PulsEnergy/TotalEnergy>UpLimit); }
void check(double ***f) //calculate energy of pulsations of all components and know if there's crash { int i,k,l; //double meanp = 0; //long kol=0; PulsEnergy=0; TotalEnergy=0; for(i=0;i<m1;i++) for(k=0;k<m3;k++) if(isType(node[i][k],NodeFluid) && !isType(node[i][k],NodeClued)) { // meanp += f[0][i][k]; // kol++; PulsEnergy+=deviation(f,i,k); for(l=1;l<=3;l++) TotalEnergy += fabs(1+coordin(i,0)*rc)*pow(f[l][i][k],2.); } /*meanp /= kol; for(i=0;i<m1;i++) for(k=0;k<m3;k++) f[0][i][k] -= meanp;*/ TotalEnergy += 1.; //if zero average field razlet = (PulsEnergy/TotalEnergy>UpLimit); }
void printing(double ****f1,double dtdid,double t_cur,long count,double en) { double temp, divv, divB, totdivv, totdivB; int i,j,k,l; double mf[3], totmf[3], toten; //mf[0]=max(f), mf[1]=max(df), mf[2]=max(df/f) FILE *fv,*fnu,*fen,*fkv; //clrscr(); time_now = MPI_Wtime(); Master printf("program is working %0.2f seconds\n",time_now-time_begin); calculate_curl(&f1[4],B,NodeMagn); divv = divB = 0; for(i=0;i<m1;i++) for(j=ghost;j<mm2;j++) for(k=0;k<m3;k++) { if(isType(node[i][k],NodeFluid) && !isType(node[i][k],NodeClued)) { temp=dr(f1[1],i,j,k,1,0,dx[0],ghost, approx) +dr(f1[2],i,j,k,2,0,dx[1],ghost, approx)*r_1[i] +dr(f1[3],i,j,k,3,0,dx[2],ghost, approx)+f1[1][i][j][k]*r_1[i]; if (fabs(temp)>divv) divv=fabs(temp); } if(isType(node[i][k],NodeMagn) && !isType(node[i][k],NodeClued)) { temp=dr(B[0],i,j,k,1,0,dx[0],ghost, approx) +dr(B[1],i,j,k,2,0,dx[1],ghost, approx)*r_1[i] +dr(B[2],i,j,k,3,0,dx[2],ghost, approx)+B[0][i][j][k]*r_1[i]; if (fabs(temp)>divB) divB=fabs(temp); } } MPI_Allreduce(&divv, &totdivv, 1, MPI_DOUBLE , MPI_MAX, MPI_COMM_WORLD); MPI_Allreduce(&divB, &totdivB, 1, MPI_DOUBLE , MPI_MAX, MPI_COMM_WORLD); Master printf("t=%g dtdid=%g NIter=%d maxdivv=%g(local=%g) maxdivB=%g(local=%g)\n", t_cur, dtdid, count, totdivv, divv, totdivB, divB); MPI_Allreduce(&en, &toten, 1, MPI_DOUBLE , MPI_SUM, MPI_COMM_WORLD); Master printf("Energy of pulsations=%g (local=%g)\n",toten,en); Master fen = fileopen(NameEnergyFile,count); Master fprintf(fen,"%8.8g \t%e",t_cur,toten); // -------------------Maxima of array components and their changes--------------------------- for(l=0;l<nvar;l++) { mf[0]=mf[1]=mf[2]=0; for(i=0;i<m1;i++) for(j=ghost;j<m2;j++) for(k=0;k<mm3;k++) if((l<=3 && isType(node[i][k],NodeFluid) || l>=4&& isType(node[i][k],NodeMagn)) && !isType(node[i][k],NodeClued)) { if (fabs(f1[l][i][j][k])>mf[0]) mf[0]=fabs(f1[l][i][j][k]); temp=fabs(f[l][i][j][k]-f1[l][i][j][k]); if (temp>mf[1]) mf[1]=temp; if(f1[l][i][j][k]!=0) temp/=f1[l][i][j][k]; if (temp>mf[2]) mf[2]=temp; } MPI_Allreduce(&mf, &totmf, 3, MPI_DOUBLE , MPI_MAX, MPI_COMM_WORLD); Master printf("%d maxf=%e(loc=%e) \tmaxdf=%e(loc=%e) \tmax(df/f)=%e(loc=%e)\n", l, totmf[0],mf[0], totmf[1],mf[1], totmf[2],mf[2]); Master fprintf(fen,"\t %e \t %e",totmf[0],totmf[1]); } for(l=0;l<3;l++) { mf[0]=mf[1]=mf[2]=0; for(i=0;i<m1;i++) for(j=ghost;j<m2;j++) for(k=0;k<mm3;k++) if(isType(node[i][k],NodeMagn) && !isType(node[i][k],NodeClued)) { if (fabs(B[l][i][j][k])>mf[0]) mf[0]=fabs(B[l][i][j][k]); } MPI_Allreduce(&mf, &totmf, 1, MPI_DOUBLE , MPI_MAX, MPI_COMM_WORLD); Master printf("%d maxB=%e(loc=%e)\n", l, totmf[0],mf[0]); Master fprintf(fen,"\t %e",totmf[0]); } // --------------- quadratic norma of arrays -------------------------------------- for(l=0;l<nvar;l++) { mf[0]=0; for(i=0;i<m1;i++) for(j=ghost;j<m2;j++) for(k=0;k<mm3;k++) if((l<=3 && isType(node[i][k],NodeFluid) || l>=4&& isType(node[i][k],NodeMagn)) && !isType(node[i][k],NodeClued)) mf[0] += coordin(i,0)*pow(f1[l][i][j][k],2); MPI_Allreduce(&mf, &totmf, 1, MPI_DOUBLE , MPI_SUM, MPI_COMM_WORLD); Master fprintf(fen,"\t %e",totmf[0]/N1/N2/N3); } for(l=0;l<3;l++) { mf[0]=0; for(i=0;i<m1;i++) for(j=ghost;j<m2;j++) for(k=0;k<mm3;k++) if(isType(node[i][k],NodeMagn)) mf[0] += coordin(i,0)*pow(B[l][i][j][k],2); MPI_Allreduce(&mf, &totmf, 1, MPI_DOUBLE , MPI_SUM, MPI_COMM_WORLD); Master fprintf(fen,"\t %e",totmf[0]/N1/N2/N3); } Master fprintf(fen,"\n"); Master fclose(fen); // Master printf("number of runge-kutt calculations=%d\n",enter); // -------------------- average profile of velocity --------------------- for(i=0;i<N3;i++) vfi[i]=0; for(i=0;i<N3;i++) totvfi[i]=0; for(i=0;i<m1;i++) for(j=ghost;j<mm2;j++) for(k=0;k<m3;k++) if(isType(node[i][k],NodeFluid) && !isType(node[i][k],NodeClued)) vfi[k-ghost+n[2]] += f[2][i][j][k]; MPI_Allreduce(vfi, totvfi, N2, MPI_DOUBLE , MPI_SUM, MPI_COMM_WORLD); Master {for(i=0;i<N3;i++) totvfi[i] /= N1*N3; fv = fileopen(NameVFile,count); fprintf(fv,"{%8.8f}\t",t_cur); print_array1d(fv,totvfi,0,N3); fclose(fv); } }
void init_conditions() { int i,j,k,l; double r, rho, r1, z1; // double k1,k2,k3; // -------- filling of nodes' types +reflections rel circle + nut --------------- for(i=0;i<m1;i++) for(k=0;k<m3;k++) { node[i][k] = NodeUnknown; for(j=0;j<m2;j++) nut[i][j][k]=( // (0.39+14.8*exp(-2.13*pow(2*coordin(k,2)-l3,2)))*0.1*0 +1.)/Re; if(pr_neighbour[0]!=-1 && i<ghost || pr_neighbour[1]!=-1 && i>=mm1 || pr_neighbour[4]!=-1 && k<ghost || pr_neighbour[5]!=-1 && k>=mm3) setType(&node[i][k],NodeClued); } for(i=0;i<m1;i++) for(k=0;k<m3;k++) { r1 = coordin(i,0); z1 = coordin(k,2); rho=sqrt(pow(r1-rc,2) + z1*z1); //regions if(rho>Rsh) setType(&node[i][k],NodeVacuum); else if(rho>Rfl) setType(&node[i][k],NodeShell); else setType(&node[i][k],NodeFluid); //for hydrodynamics if(isType(node[i][k],NodeFluid)) { if(isType(node[i][k],NodeGhostFluid)) node[i][k] -= NodeGhostFluid; for(l=-ghost;l<=ghost;l++) { if(i+l>=0&&i+l<m1) if(!isType(node[i+l][k],NodeFluid)) setType(&node[i+l][k],NodeGhostFluid); if(k+l>=0&&k+l<m3) if(!isType(node[i][k+l],NodeFluid)) setType(&node[i][k+l],NodeGhostFluid); } } refr_f[i][k] = rc + (r1-rc)*(2*Rfl/rho-1); //physical coordinates refz_f[i][k] = z1*(2*Rfl/rho-1); refr_f[i][k] = (refr_f[i][k]-rc+R)/dx[0]-0.5-n[0]+ghost; // simulation indices refz_f[i][k] = (refz_f[i][k]+R )/dx[2]-0.5-n[2]+ghost; if(fabs(refr_f[i][k]-i)<1 && fabs(refz_f[i][k]-k)<1 && !isType(node[i][k],NodeFluid)) { setType(&node[i][k],NodeFluid); if(isType(node[i][k],NodeGhostFluid)) node[i][k] -= NodeGhostFluid; for(l=-ghost;l<=ghost;l++) { if(i+l>=0&&i+l<m1) if(!isType(node[i+l][k],NodeFluid)) setType(&node[i+l][k],NodeGhostFluid); if(k+l>=0&&k+l<m3) if(!isType(node[i][k+l],NodeFluid)) setType(&node[i][k+l],NodeGhostFluid); } } //for magnetism refr_m[i][k] = i; refz_m[i][k] = k; if(i+n[0]<ghost) {setType(&node[i][k],NodeGhostMagn); refr_m[i][k] = 2*ghost-i-1;} else if(i+n[0]>=N1+ghost) {setType(&node[i][k],NodeGhostMagn); refr_m[i][k] = 2*mm1-i-1;} if(k+n[2]<ghost) {setType(&node[i][k],NodeGhostMagn); refz_m[i][k] = 2*ghost-k-1;} else if(k+n[2]>=N3+ghost) {setType(&node[i][k],NodeGhostMagn); refz_m[i][k] = 2*mm3-k-1;} if(!isType(node[i][k],NodeGhostMagn)) setType(&node[i][k],NodeMagn); //for divertor's blade sinth[i][k]=(r1-rc)/rho; costh[i][k]= z1 /rho; chi[i][k] = chimax*M_PI/180.*rho/R; } for(i=0;i<m1;i++) { r_1[i]=1./coordin(i,0); r_2[i]=r_1[i]*r_1[i]; } for(i=0;i<m1;i++) for(j=0;j<m2;j++) for(k=0;k<m3;k++) { if(isType(node[i][k],NodeFluid)) eta[i][j][k]=1./Rm/etavac; if(isType(node[i][k],NodeShell)) eta[i][j][k]=etash/Rm/etavac; if(isType(node[i][k],NodeVacuum)) eta[i][j][k]=1./Rm; for(l=0;l<3;l++) B[l][i][j][k] = 0; } // --------------- initial conditions ----------------------------------------- // k1=2*M_PI/lfi; k3=M_PI/l3; if(!goon) { for(i=0;i<m1;i++) for(j=0;j<m2;j++) for(k=0;k<m3;k++) { if(isType(node[i][k],NodeFluid)) { f[0][i][j][k]=0; /* f[1][i][j][k]=Noise*((double)rand()-RAND_MAX/2)/RAND_MAX* (Rfl*Rfl-pow(coordin(i,0)-rc,2) - pow(coordin(k,2),2))*4/Rfl/Rfl; f[2][i][j][k]=NoiseNorm*cos(2*M_PI*coordin(j,1)/R)*sin(2*M_PI*coordin(k,2)/Rfl) + (parabole+Noise*((double)rand()-RAND_MAX/2)/RAND_MAX)* (Rfl*Rfl-pow(coordin(i,0)-rc,2) - pow(coordin(k,2),2))*4/Rfl/Rfl; f[3][i][j][k]=NoiseNorm*sin(2*M_PI*coordin(j,1)/R)*sin(2*M_PI*coordin(k,2)/Rfl) + Noise*((double)rand()-RAND_MAX/2)/RAND_MAX* (Rfl*Rfl-pow(coordin(i,0)-rc,2) - pow(coordin(k,2),2))*4/Rfl/Rfl;*/ f[1][i][j][k]=f[2][i][j][k]=f[3][i][j][k]=0; } if(isType(node[i][k],NodeMagn)) { f[4][i][j][k]=coordin(i,0)*cos(coordin(j,1))*sin(coordin(j,1)); f[5][i][j][k]=coordin(i,0)*cos(coordin(j,1))*cos(coordin(j,1)); f[6][i][j][k]=0; /* f[4][i][j][k]=0; f[5][i][j][k]=0; f[6][i][j][k]=coordin(i,0);*/ } } // struct_func(f,2,2,3); nmessage("Arrays were filled with initial values - calculation from beginning",0,0); } else nmessage("Arrays were filled with initial values - calculation is continuing",t_cur,count); }
int main (int argc, char ** argv) { pca::pcafitter fitter; bool fast = false; bool verbose = false; bool selectsubsector = true; bool selectsubladder = false; bool useallsubsectors = false; bool useallsubladders = false; bool useonlyeven = false; bool usesegid = false; bool printallcoords = false; while (1) { int c, option_index; static struct option long_options[] = { {"help", 0, NULL, 'h'}, {"verbose", 0, NULL, 'V'}, {"bigger-sub-tower", 0, NULL, 's'}, {"bigger-sub-sub-tower", 0, NULL, 'l'}, {"fast", 0, NULL, 'f'}, {"version", 0, NULL, 'v'}, {"all-sub-tower", 0, NULL, 'a'}, {"all-sub-sub-tower", 0, NULL, 'r'}, {"seg-id", 0, NULL, 'i'}, {"jump-tracks", 0, NULL, 'j'}, {"dump-allcoords", 0, NULL, 'p'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "iravhVslfjp", long_options, &option_index); if (c == -1) break; switch (c) { case 'p': printallcoords = true; break; case 'j': useonlyeven = true; break; case 'i': usesegid = true; break; case 'h': usage (argv[0]); break; case 'v': std::cout << "Version: " << pca::pcafitter::get_version_string() << std::endl; exit(1); break; case 'a': useallsubsectors = true; break; case 'r': useallsubladders = true; break; case 'f': fast = true; break; case 'V': verbose = true; break; case's': selectsubsector = true; selectsubladder = false; break; case 'l': selectsubladder = true; selectsubsector = false; break; default: usage (argv[0]); break; } } if (usesegid) fitter.set_coordim (6); fitter.set_paramdim(5); if (!fitter.set_paramidx(ONEOVERPTIDX, "oneoverpt")) { std::cerr << fitter.get_errmsg() << std::endl; return EXIT_FAILURE; } if (!fitter.set_paramidx(PHIIDX, "phi")) { std::cerr << fitter.get_errmsg() << std::endl; return EXIT_FAILURE; } if (!fitter.set_paramidx(COTTETHAIDX, "cot(tetha)")) { std::cerr << fitter.get_errmsg() << std::endl; return EXIT_FAILURE; } if (!fitter.set_paramidx(Z0IDX, "z0")) { std::cerr << fitter.get_errmsg() << std::endl; return EXIT_FAILURE; } if (!fitter.set_paramidx(D0IDX, "d0")) { std::cerr << fitter.get_errmsg() << std::endl; return EXIT_FAILURE; } if (optind >= argc) usage (argv[0]); if (selectsubladder && selectsubsector) usage (argv[0]); if (useallsubsectors || useallsubladders) { selectsubladder = false; selectsubsector = false; } if (useallsubladders && useallsubsectors) usage (argv[0]); char * filename = (char *) alloca (strlen(argv[optind]) + 1); strcpy (filename, argv[optind]); // leggere file coordinate tracce simulate plus parametri if (!pca::file_exists(filename)) { std::cerr << "Inout file does not exist" << std::endl; return EXIT_FAILURE; } int num_of_line = pca::numofline(filename); std::cout << "file has " << num_of_line << " line " << std::endl; int num_of_ent_read = (num_of_line-1)/ENTDIM; int num_of_ent = num_of_ent_read; if (useonlyeven) { if (num_of_ent_read % 2) num_of_ent = (num_of_ent_read-1)/2; else num_of_ent = num_of_ent_read/2; } std::cout << "file has " << num_of_ent << " entries " << std::endl; // non perfomante ma easy to go arma::mat layer, ladder, module, coordin, paramin; layer.set_size(num_of_ent,fitter.get_coordim()); ladder.set_size(num_of_ent,fitter.get_coordim()); module.set_size(num_of_ent,fitter.get_coordim()); coordin.set_size(num_of_ent,fitter.get_coordim()); paramin.set_size(num_of_ent,fitter.get_paramdim()); std::map<std::string, int> subsectors, subladders; std::vector<std::string> subladderslist, subsectorslist; // leggere file coordinate tracce simulate plus parametri std::cout << "Reading data from " << filename << " file " << std::endl; pca::reading_from_file (filename, paramin, coordin, layer, ladder, module, subsectors, subladders, subsectorslist, subladderslist, num_of_ent_read, usesegid, useonlyeven, false); // write date to file if (printallcoords) { std::cout << "Printout coordinates " << std::endl; std::ofstream myfilect("allcoords.txt"); for (int i=0; i<(int)coordin.n_rows; ++i) for (int j=0; j<fitter.get_coordim(); j=j+3) myfilect << coordin(i, j) << " " << coordin(i, j+1) << " " << coordin(i, j+2) << std::endl; myfilect.close(); } std::cout << "Writing parameters to files" << std::endl; pca::write_to_file("oneoverpt.txt", paramin, ONEOVERPTIDX); pca::write_to_file("phi.txt", paramin, PHIIDX); pca::write_to_file("d0.txt", paramin, D0IDX); pca::write_to_file("cotetha.txt", paramin, COTTETHAIDX); pca::write_to_file("z0.txt", paramin, Z0IDX); if (!useallsubsectors && !useallsubladders) { // values selection std::string slctsubsec = ""; int maxnumber = 0; arma::mat coord, param; assert(selectsubsector != selectsubladder); if (selectsubladder || selectsubsector) { if (selectsubsector) { std::cout << "Looking for bigger subsector" << std::endl; std::cout << "We found " << subsectors.size() << " subsectors " << std::endl; fitter.select_bigger_sub (subsectors, verbose, maxnumber, slctsubsec); std::cout << "Selected subsector " << slctsubsec << " numevt: " << maxnumber << std::endl; fitter.extract_sub (subsectorslist, slctsubsec, paramin, coordin, param, coord); } if (selectsubladder) { std::cout << "Looking for bigger subladder" << std::endl; std::cout << "We found " << subladders.size() << " subladders " << std::endl; fitter.select_bigger_sub (subladders, verbose, maxnumber, slctsubsec); std::cout << "Selected subladder " << slctsubsec << " numevt: " << maxnumber << std::endl; fitter.extract_sub (subladderslist, slctsubsec, paramin, coordin, param, coord); } } else { param = paramin; coord = coordin; } std::cout << "Printout selected coordinates " << std::endl; std::ofstream myfileslct("selectedcoords.txt"); for (int i=0; i<(int)coord.n_rows; ++i) for (int j=0; j<fitter.get_coordim(); j=j+3) myfileslct << coord(i, j) << " " << coord(i, j+1) << " " << coord(i, j+2) << std::endl; myfileslct.close(); // write date to file std::cout << "Writing extracted parameters to files" << std::endl; pca::write_to_file("oneoverpt_selected.txt", param, ONEOVERPTIDX); pca::write_to_file("phi_selected.txt", param, PHIIDX); pca::write_to_file("d0_selected.txt", param, D0IDX); pca::write_to_file("cotetha_selected.txt", param, COTTETHAIDX); pca::write_to_file("z0_selected.txt", param, Z0IDX); std::ostringstream cfname, qfname; cfname << "c." << slctsubsec << ".bin"; qfname << "q." << slctsubsec << ".bin"; perform_main_computation (fast, verbose, coord, param, cfname.str(), qfname.str(), fitter); } else { assert(useallsubladders != useallsubsectors); arma::mat coord, param; unsigned int totalamnt = 0, usedamnt = 0; std::vector<std::string> * listtouse = NULL; std::set<std::string> sectrorset; if (useallsubsectors) { std::vector<std::string>::const_iterator selecteds = subsectorslist.begin(); for (; selecteds != subsectorslist.end(); ++selecteds) sectrorset.insert(*selecteds); listtouse = &subsectorslist; } else if (useallsubladders) { std::vector<std::string>::const_iterator selecteds = subladderslist.begin(); for (; selecteds != subladderslist.end(); ++selecteds) sectrorset.insert(*selecteds); listtouse = &subladderslist; } else usage(argv[0]); std::set<std::string>::const_iterator selected = sectrorset.begin(); for (; selected != sectrorset.end(); ++selected) { fitter.extract_sub (*listtouse, *selected, paramin, coordin, param, coord); std::cout << "Selected " << *selected << " size " << coord.n_rows << std::endl; totalamnt += coord.n_rows; if (coord.n_rows > MINDIMLINIT) { std::ostringstream cfname, qfname; cfname << "c." << *selected << ".bin"; qfname << "q." << *selected << ".bin"; perform_main_computation (fast, verbose, coord, param, cfname.str(), qfname.str(), fitter); usedamnt += coord.n_rows; } } std::cout << "Total tracks: " << totalamnt << std::endl; std::cout << "Used tracks: " << usedamnt << std::endl; } return EXIT_SUCCESS; }
void init_conditions(double ****f,double Re) { int i,j,k,l; double Noise=0.3, Noise1=0; // double k1,k2,k3; // k1=2*M_PI/l1; k3=M_PI/l3; for(i=0;i<m1;i++) for(j=0;j<m2;j++) for(k=0;k<m3;k++) { f[0][i][j][k]=(1+Noise*((double)rand()-RAND_MAX/2)/RAND_MAX)* coordin(k,2)*(l3-coordin(k,2))*4/l3/l3; f[1][i][j][k]=Noise1*cos(2*M_PI*coordin(j,1)/l2)*cos(2*M_PI*coordin(k,2)/l3) + Noise*((double)rand()-RAND_MAX/2)/RAND_MAX* coordin(k,2)*(l3-coordin(k,2))*4/l3/l3; f[2][i][j][k]=Noise1*sin(2*M_PI*coordin(j,1)/l2)*sin(2*M_PI*coordin(k,2)/l3) + Noise*((double)rand()-RAND_MAX/2)/RAND_MAX* coordin(k,2)*(l3-coordin(k,2))*4/l3/l3; f[3][i][j][k]=p1+(i-0.5)*(p2-p1)/n1; nut[i][j][k]=( (0.39+14.8*exp(-2.13*pow(2*coordin(k,2)-l3,2)))*0.1 +1)/Re; } // struct_func(f,2,2,3); }
int Engine::initialize() { // For Tracing std::vector < std::string > keys; keys.push_back("currentEnergy"); keys.push_back("minEnergy"); keys.push_back("nSteps"); keys.push_back("temperature"); tracer_.clear(); tracer_.setKeyList(keys); if (isVerbose()) { Rprintf("Initialization...\n"); } // Init x related vectors try { xRange_.resize(x_.size()); xBackup_.resize(x_.size()); xMini_.resize(x_.size()); xBuffer_.resize(x_.size()); g_.resize(x_.size()); } catch (std::length_error& le) { Rprintf("Engine: Length error: %s\n",le.what()); } itSoftMax_ = x_.size() * 6; factr_ = 1000; pgTol_ = 1.e-6; reps_ = 1.e-6; nbFctCall_ = 0; idum_ = -100377; indTrace_ = 0; // Check markov chain length if (0 != markovLength_ % x_.size()) { Rprintf( "LMarkov should be size of 'x' (recommended) or 2*n or 3*n ... since component.change is 1\n"); return -1; } // if (lsEnd_) // { // markovLength_ = 200 * x_.size(); // if (markovLength_ < 1000) // { // markovLength_ = 1000; // } // else if (markovLength_ > 10000) // { // markovLength_ = 10000; // } // } if (isVerbose()) { Rprintf("LMarkov= %i\n", markovLength_); } for (unsigned int i = 0; i < x_.size(); ++i) { xRange_[i] = upper_[i] - lower_[i]; } if (isVerbose()) { Rprintf("xrange: "); printVect(xRange_); } // Check if starting point is in constraint bool inConstraint = true; bool initError = true; unsigned int reinitCount = 0; while (initError) { if (inConstraint) { if (hasConstraint_) { inConstraint = judgeConstraint(); while (!inConstraint) { coordin(idum_, x_); inConstraint = judgeConstraint(); } } } if (isVerbose()) { Rprintf("The random intial x coordinates:\n"); printVect(x_); } energy(x_); if (isVerbose()) { Rprintf("The energy of initial x = %.10g\n", etot_); } if (etot_ >= BIG_VALUE) { if (isVerbose()) { Rprintf("x: "); printVect(x_); Rprintf( " give NaN, NA, or inf, generating new starting point\n"); } if (reinitCount >= MAX_REINIT_COUNT) { Rprintf("Stopping algorithm because function to optimize create NaN or (+/-) infinity values even with trying new random parameters"); return -1; } double rd = 0; for (unsigned int i=0; i < x_.size(); ++i) { // lower + runif(length(lower))*(upper-lower) rd = Utils::ran2(&idum_); x_[i] = lower_[i] + rd * (upper_[i] - lower_[i]); } reinitCount++; } else { initError = false; } } return 0; }