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

📄 xmdsintegratesiex.cc

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