📄 xmdsintegratesiex.cc
字号:
// add cross vectors to total vectors to use list<XMLString> myTotalVectorsList = myMainVectorNamesList; for(list<XMLString>::const_iterator pXMLString = crossVectorNamesList()->begin(); pXMLString != crossVectorNamesList()->end(); pXMLString++) { myTotalVectorsList.push_back(*pXMLString); } simulation()->field()->vectors2space(outfile,0,myTotalVectorsList,""); // open outer loops for(unsigned long i=0; i<crossDimNumber(); i++) { for(unsigned long j=0; j<i; j++) { fprintf(outfile," "); } fprintf(outfile,"double %s = _%s_xmin%li;\n",simulation()->field()->geometry()->dimension(i)->name.c_str(),fieldName,i); fprintf(outfile,"\n"); for(unsigned long j=0; j<i; j++) { fprintf(outfile," "); } fprintf(outfile,"for(unsigned long _i%li=0; _i%li<_%s_lattice%li; _i%li++) {\n",i,i,fieldName,i,i); fprintf(outfile,"\n"); } for(unsigned long j=0; j<crossDimNumber(); j++) { fprintf(outfile," "); } fprintf(outfile,"double %s = _%s_xmin%li;\n", simulation()->field()->geometry()->dimension(crossDimNumber())->name.c_str(),fieldName,crossDimNumber()); fprintf(outfile,"\n"); for(unsigned long j=0; j<crossDimNumber(); j++) { fprintf(outfile," "); } fprintf(outfile,"for(unsigned long _i%li=0; _i%li<_%s_lattice%li-1; _i%li++) {\n", crossDimNumber(),crossDimNumber(),fieldName,crossDimNumber(),crossDimNumber()); fprintf(outfile,"\n"); char indent[64]; for(unsigned long i=0;i<crossDimNumber()+1;i++) { indent[i]=0x09; } indent[crossDimNumber()+1]=0; char indent2[64]; for(unsigned long i=0;i<nDims;i++) { indent2[i]=0x09; } indent2[nDims]=0; for(list<XMLString>::const_iterator pXMLString = myTotalVectorsList.begin(); pXMLString != myTotalVectorsList.end(); pXMLString++) { fprintf(outfile,"%sunsigned long _%s_%s_index_pointer_begin=0;\n",indent,fieldName,pXMLString->c_str()); for(unsigned long i=0; i<crossDimNumber()+1; i++) { fprintf(outfile,"%s_%s_%s_index_pointer_begin += _i%li",indent,fieldName,pXMLString->c_str(),i); for(unsigned long j=i+1;j<nDims;j++) { fprintf(outfile,"*_%s_lattice%li",fieldName,j); } fprintf(outfile,"*_%s_%s_ncomponents;\n",fieldName,pXMLString->c_str()); } fprintf(outfile,"\n"); } fprintf(outfile,"%s// copy cross vectors into I vectors\n",indent); fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = crossVectorNamesList()->begin(); pXMLString != crossVectorNamesList()->end(); pXMLString++) { fprintf(outfile,"%sfor(unsigned long _j=0; _j<_%s_cross_size*_%s_%s_ncomponents; _j++)\n", indent,fieldName,fieldName,pXMLString->c_str()); fprintf(outfile,"%s _%s_%s_I[_j] = _%s_%s[_%s_%s_index_pointer_begin + _j];\n", indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); fprintf(outfile,"\n"); } fprintf(outfile,"%s// store main vectors into old\n",indent); fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = myMainVectorNamesList.begin(); pXMLString != myMainVectorNamesList.end(); pXMLString++) { fprintf(outfile,"%sfor(unsigned long _j=0; _j<_%s_cross_size*_%s_%s_ncomponents; _j++)\n", indent,fieldName,fieldName,pXMLString->c_str()); fprintf(outfile,"%s _%s_%s_old[_j] = _active_%s_%s[_%s_%s_index_pointer_begin + _j];\n", indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); fprintf(outfile,"\n"); } fprintf(outfile,"%s// create midpoint main vectors\n",indent); fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = myMainVectorNamesList.begin(); pXMLString != myMainVectorNamesList.end(); pXMLString++) { fprintf(outfile,"%sfor(unsigned long _j=_%s_%s_index_pointer_begin; _j < _%s_%s_index_pointer_begin + _%s_cross_size*_%s_%s_ncomponents; _j++)\n", indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(),fieldName,fieldName,pXMLString->c_str()); fprintf(outfile,"%s _active_%s_%s[_j] = (_active_%s_%s[_j]+_active_%s_%s[_%s_cross_size*_%s_%s_ncomponents + _j])/2;\n", indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(), fieldName,fieldName,pXMLString->c_str()); fprintf(outfile,"\n"); } fprintf(outfile,"%s// move cross dim to lattice midpoint\n",indent); fprintf(outfile,"\n"); fprintf(outfile,"%s%s += _%s_dx%li/2;\n", indent,simulation()->field()->geometry()->dimension(crossDimNumber())->name.c_str(),fieldName,crossDimNumber()); fprintf(outfile,"\n"); fprintf(outfile,"%sfor(unsigned long _j=0; _j<%li; _j++) {\n",indent,nIterations()); fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = myTotalVectorsList.begin(); pXMLString != myTotalVectorsList.end(); pXMLString++) { fprintf(outfile,"%s unsigned long _%s_%s_index_pointer=_%s_%s_index_pointer_begin;\n", indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); } fprintf(outfile,"\n"); fprintf(outfile,"%s // calculate delta a\n",indent); fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = crossVectorNamesList()->begin(); pXMLString != crossVectorNamesList()->end(); pXMLString++) { fprintf(outfile,"%s unsigned long _%s_%s_index_pointer_local=0;\n",indent,fieldName,pXMLString->c_str()); } fprintf(outfile,"\n"); // open inner loops for(unsigned long i=crossDimNumber()+1; i<nDims; i++) { for(unsigned long j=0; j<i; j++) { fprintf(outfile," "); } fprintf(outfile," double %s = _%s_xmin%li;\n",simulation()->field()->geometry()->dimension(i)->name.c_str(),fieldName,i); fprintf(outfile,"\n"); for(unsigned long j=0; j<i; j++) { fprintf(outfile," "); } fprintf(outfile," for(unsigned long _i%li=0; _i%li<_%s_lattice%li; _i%li++) {\n",i,i,fieldName,i,i); fprintf(outfile,"\n"); } fprintf(outfile,"// *********** cross_propagation code ***********\n"); fprintf(outfile,"%s\n",crossPropagationCode()->c_str()); fprintf(outfile,"// **********************************************\n"); fprintf(outfile,"\n"); for(list<const xmdsVector*>::const_iterator pxmdsVector = crossVectorList.begin(); pxmdsVector != crossVectorList.end(); pxmdsVector++) { for(unsigned long i=0;i<(*pxmdsVector)->nComponents();i++) { fprintf(outfile,"%s _%s_%s_d[_%s_%s_index_pointer_local + %li] = d%s_d%s*_%s_dx%li;\n", indent2,fieldName,(*pxmdsVector)->name()->c_str(),fieldName,(*pxmdsVector)->name()->c_str(),i, (*pxmdsVector)->componentName(i)->c_str(), simulation()->field()->geometry()->dimension(crossDimNumber())->name.c_str(),fieldName,crossDimNumber()); } fprintf(outfile,"\n"); } //close inner loops if(crossDimNumber()+1<nDims) { for(list<XMLString>::const_iterator pXMLString = myTotalVectorsList.begin(); pXMLString != myTotalVectorsList.end(); pXMLString++) { fprintf(outfile,"%s _%s_%s_index_pointer += _%s_%s_ncomponents;\n", indent2,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); } fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = crossVectorNamesList()->begin(); pXMLString != crossVectorNamesList()->end(); pXMLString++) { fprintf(outfile,"%s _%s_%s_index_pointer_local += _%s_%s_ncomponents;\n", indent2,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); } fprintf(outfile,"\n"); } for(unsigned long i=nDims; i>crossDimNumber()+1; i--) { for(unsigned long j=0; j<i; j++) { fprintf(outfile," "); } fprintf(outfile," %s += _%s_dx%li;\n",simulation()->field()->geometry()->dimension(i-1)->name.c_str(),fieldName,i-1); fprintf(outfile,"\n"); for(unsigned long j=0; j<i; j++) { fprintf(outfile," "); } fprintf(outfile," }\n"); fprintf(outfile,"\n"); } fprintf(outfile,"%s // create next cross vectors\n",indent); fprintf(outfile,"\n"); fprintf(outfile,"%s if(_j<%li) {\n",indent,nIterations()-1); fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = crossVectorNamesList()->begin(); pXMLString != crossVectorNamesList()->end(); pXMLString++) { fprintf(outfile,"%s for(unsigned long _k=0; _k<_%s_cross_size*_%s_%s_ncomponents; _k++)\n", indent,fieldName,fieldName,pXMLString->c_str()); fprintf(outfile,"%s _%s_%s[_%s_%s_index_pointer_begin + _k] = _%s_%s_I[_k] + _%s_%s_d[_k]/2;\n", indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); fprintf(outfile,"\n"); } fprintf(outfile,"%s }\n",indent); fprintf(outfile,"%s else {\n",indent); fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = crossVectorNamesList()->begin(); pXMLString != crossVectorNamesList()->end(); pXMLString++) { fprintf(outfile,"%s for(unsigned long _k=0; _k<_%s_cross_size*_%s_%s_ncomponents; _k++)\n", indent,fieldName,fieldName,pXMLString->c_str()); fprintf(outfile,"%s _%s_%s[_%s_%s_index_pointer_begin + _%s_cross_size*_%s_%s_ncomponents + _k] = _%s_%s_I[_k] + _%s_%s_d[_k];\n", indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(),fieldName,fieldName,pXMLString->c_str(), fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); fprintf(outfile,"\n"); } fprintf(outfile,"%s }\n",indent); fprintf(outfile,"\n"); fprintf(outfile,"%s }\n",indent); fprintf(outfile,"\n"); fprintf(outfile,"%s// copy I cross vector back into old main cross vector\n",indent); fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = crossVectorNamesList()->begin(); pXMLString != crossVectorNamesList()->end(); pXMLString++) { fprintf(outfile,"%sfor(unsigned long _j=0; _j<_%s_cross_size*_%s_%s_ncomponents; _j++)\n", indent,fieldName,fieldName,pXMLString->c_str()); fprintf(outfile,"%s _%s_%s[_%s_%s_index_pointer_begin + _j] = _%s_%s_I[_j];\n", indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); fprintf(outfile,"\n"); } fprintf(outfile,"%s// copy old main vectors back into last lattice point\n",indent); fprintf(outfile,"\n"); for(list<XMLString>::const_iterator pXMLString = myMainVectorNamesList.begin(); pXMLString != myMainVectorNamesList.end(); pXMLString++) { fprintf(outfile,"%sfor(unsigned long _j=0; _j<_%s_cross_size*_%s_%s_ncomponents; _j++)\n", indent,fieldName,fieldName,pXMLString->c_str()); fprintf(outfile,"%s _active_%s_%s[_%s_%s_index_pointer_begin + _j] = _%s_%s_old[_j];\n", indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); fprintf(outfile,"\n"); } // close outer loops fprintf(outfile,"%s}\n",indent); fprintf(outfile,"\n"); for(unsigned long i=crossDimNumber(); i>0; i--) { for(unsigned long j=0; j<i; j++) { fprintf(outfile," "); } fprintf(outfile,"%s += _%s_dx%li;\n",simulation()->field()->geometry()->dimension(i-1)->name.c_str(),fieldName,i-1); fprintf(outfile,"\n"); for(unsigned long j=0; j<i; j++) { fprintf(outfile," "); } fprintf(outfile,"}\n"); fprintf(outfile,"\n"); } // Free allocated memory for(list<XMLString>::const_iterator pXMLString = myMainVectorNamesList.begin(); pXMLString != myMainVectorNamesList.end(); pXMLString++) { fprintf(outfile," delete[] _%s_%s_old;\n",fieldName,pXMLString->c_str()); } for(list<XMLString>::const_iterator pXMLString = crossVectorNamesList()->begin(); pXMLString != crossVectorNamesList()->end(); pXMLString++) { fprintf(outfile," delete[] _%s_%s_I;\n",fieldName,pXMLString->c_str()); fprintf(outfile," delete[] _%s_%s_d;\n",fieldName,pXMLString->c_str()); fprintf(outfile,"\n"); } fprintf(outfile,"}\n"); fprintf(outfile,"\n");};// ******************************************************************************void xmdsIntegrateSIEX::writeSingleStepCode( FILE *const outfile, const stepCaseEnum& stepCase) const { if(debugFlag) { printf("xmdsIntegrateSIEX::writeSingleStepCode\n"); } const char *const fieldName = simulation()->field()->name()->c_str(); const char *const propDim = simulation()->parameters()->propDimName.c_str(); list<XMLString> tempVectorNamesList; tempVectorNamesList.push_back("main"); const char* indent = " "; if(simulation()->parameters()->errorCheck) { indent = " "; } const char* noiseVector = ""; if((simulation()->parameters()->stochastic)&&(!noNoises())) { noiseVector = ",_noise_vector"; } simulation()->field()->vectors2space(outfile,0,tempVectorNamesList,indent); fprintf(outfile,"%s// a_i=a\n",indent); if(simulation()->parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1<total_local_size*_%s_main_ncomponents; _i1++)\n",indent,fieldName); } else { fprintf(outfile,"%sfor(unsigned long _i1=0; _i1<_%s_size*_%s_main_ncomponents; _i1++)\n",indent,fieldName,fieldName); } fprintf(outfile,"%s aifield_%s_main[_i1] = _%s_main[_i1];\n",indent,fieldName,fieldName); fprintf(outfile,"\n"); fprintf(outfile,"%s%s += _step/2;\n",indent,propDim); fprintf(outfile,"\n"); fprintf(outfile,"%sfor(unsigned long _i1=0; _i1<%li; _i1++) {\n",indent,nIterations()); fprintf(outfile,"\n"); if(usesKOperators()) { fprintf(outfile,"%s // calculate the co derivative terms\n",indent); fprintf(outfile,"%s _segment%li_calculate_co_terms();\n",indent,segmentNumber); fprintf(outfile,"\n"); } fprintf(outfile,"%s // delta a = G[a,t]\n",indent); fprintf(outfile,"%s _segment%li_calculate_delta_a(_step,cycle%s);\n",indent,segmentNumber,noiseVector); fprintf(outfile,"\n"); fprintf(outfile,"%s if(_i1<%li)\n",indent,nIterations()-1); fprintf(outfile,"%s // a = ai + delta a/2\n",indent); if(simulation()->parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%s for(long _i2=0; _i2<total_local_size*_%s_main_ncomponents; _i2++)\n",indent,fieldName); } else { fprintf(outfile,"%s for(unsigned long _i2=0; _i2<_%s_size*_%s_main_ncomponents; _i2++)\n",indent,fieldName,fieldName); } fprintf(outfile,"%s _%s_main[_i2] = aifield_%s_main[_i2] + _%s_main[_i2]/2;\n",indent,fieldName,fieldName,fieldName); fprintf(outfile,"%s else\n",indent); fprintf(outfile,"%s // a = ai + delta a\n",indent); if(simulation()->parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%s for(long _i2=0; _i2<total_local_size*_%s_main_ncomponents; _i2++)\n",indent,fieldName); } else { fprintf(outfile,"%s for(unsigned long _i2=0; _i2<_%s_size*_%s_main_ncomponents; _i2++)\n",indent,fieldName,fieldName); } fprintf(outfile,"%s _%s_main[_i2] = aifield_%s_main[_i2] + _%s_main[_i2];\n",indent,fieldName,fieldName,fieldName); fprintf(outfile,"%s }\n",indent); fprintf(outfile,"\n"); fprintf(outfile,"%s%s += _step/2;\n",indent,propDim); fprintf(outfile,"\n");};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -