⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmdsintegraterk4.cc

📁 XMDS is a code generator that integrates equations. You write them down in human readable form in a
💻 CC
📖 第 1 页 / 共 3 页
字号:
  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 + -