📄 xmdsintegraterk4.cc
字号:
for(list<XMLString>::const_iterator pXMLString = crossVectorNamesList()->begin(); pXMLString != crossVectorNamesList()->end(); pXMLString++) { const xmdsVector* crossVector; if(!simulation()->field()->getVector(*pXMLString,crossVector)) { throw xmdsException("Internal error in xmdsIntegrateRK4::writeCalculateCrossFieldRoutine: cannot find cross vector"); } crossVectorList.push_back(crossVector); if(crossVector->vectorType()==DOUBLE) { typeName="double"; } else { typeName="complex"; } fprintf(outfile,"%s *_%s_%s_K = new %s[_%s_cross_size*_%s_%s_ncomponents];\n", typeName,fieldName,crossVector->name()->c_str(),typeName,fieldName,fieldName,crossVector->name()->c_str()); fprintf(outfile,"%s *_%s_%s_I = new %s[_%s_cross_size*_%s_%s_ncomponents];\n", typeName,fieldName,crossVector->name()->c_str(),typeName,fieldName,fieldName,crossVector->name()->c_str()); fprintf(outfile,"%s *_%s_%s_d = new %s[_%s_cross_size*_%s_%s_ncomponents];\n", typeName,fieldName,crossVector->name()->c_str(),typeName,fieldName,fieldName,crossVector->name()->c_str()); fprintf(outfile,"\n"); for(unsigned long i=0;i<crossVector->nComponents();i++) { fprintf(outfile,"%s d%s_d%s;\n", typeName,crossVector->componentName(i)->c_str(), simulation()->field()->geometry()->dimension(crossDimNumber())->name.c_str()); } fprintf(outfile,"\n"); } // 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 K and 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_K[_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,"%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,"%s }\n",indent); 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// ********** step 1 ***************\n",indent); fprintf(outfile,"\n"); fprintf(outfile,"%s {\n",indent); 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 k1\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 }\n",indent); fprintf(outfile,"\n"); fprintf(outfile,"%s// add to K 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_K[_j] += _%s_%s_d[_j]/6;\n",indent,fieldName,pXMLString->c_str(),fieldName,pXMLString->c_str()); fprintf(outfile,"\n"); } fprintf(outfile,"%s// create next cross 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[_%s_%s_index_pointer_begin + _j] = _%s_%s_I[_j] + _%s_%s_d[_j]/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// create midpoint main vectors for steps 2 and 3\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 for steps 2 and 3\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,"%s// ********** step 2 ***************\n",indent); fprintf(outfile,"\n"); fprintf(outfile,"%s {\n",indent); 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 k1\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," "); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -