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

📄 xmdsintegraterk4ip.cc

📁 XMDS is a code generator that integrates equations. You write them down in human readable form in a
💻 CC
字号:
/* Copyright (C) 2000-2004 Code contributed by Greg Collecutt, Joseph Hope and Paul Cochrane This file is part of xmds.  This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.*//*  $Id: xmdsintegraterk4ip.cc,v 1.13 2004/09/15 06:01:58 joehope Exp $*//*! @file xmdsintegraterk4ip.cc  @brief Integrate element parsing classes and methods; fourth order Runge-Kutta in the interaction picture  More detailed explanation...*/#include<xmlbasics.h>#include<dom3.h>#include<xmdsutils.h>#include<xmdsclasses.h>// ******************************************************************************// ******************************************************************************//                              xmdsIntegrateRK4IP public// ******************************************************************************// ******************************************************************************extern bool debugFlag;long nxmdsIntegrateRK4IPs=0; //!< The number of xmds integrate RK4IP objects// ******************************************************************************xmdsIntegrateRK4IP::xmdsIntegrateRK4IP(				       const xmdsSimulation *const yourSimulation,				       const bool& yourVerboseMode) :  xmdsIntegrate(yourSimulation,yourVerboseMode),  xmdsIntegrateIP(yourSimulation,yourVerboseMode),  xmdsIntegrateRK4(yourSimulation,yourVerboseMode) {  if(debugFlag) {    nxmdsIntegrateRK4IPs++;    printf("xmdsIntegrateRK4IP::xmdsIntegrateRK4IP\n");    printf("nxmdsIntegrateRK4IPs=%li\n",nxmdsIntegrateRK4IPs);  }};// ******************************************************************************xmdsIntegrateRK4IP::~xmdsIntegrateRK4IP() {  if(debugFlag) {    nxmdsIntegrateRK4IPs--;    printf("xmdsIntegrateRK4IP::~xmdsIntegrateRK4IP\n");    printf("nxmdsIntegrateRK4IPs=%li\n",nxmdsIntegrateRK4IPs);  }};// ******************************************************************************void xmdsIntegrateRK4IP::processElement(					const Element *const yourElement) {  if(debugFlag) {    printf("xmdsIntegrateRK4IP::processElement\n");  }  if(verbose()) {    printf("Processing integrate RK4IP element ...\n");  }  xmdsIntegrate::processElement(yourElement);  xmdsIntegrateRK4::processElement(yourElement);  xmdsIntegrateIP::processElement(yourElement);};// ******************************************************************************// ******************************************************************************//                              xmdsIntegrateRK4IP private// ******************************************************************************// ******************************************************************************// ******************************************************************************void xmdsIntegrateRK4IP::writePrototypes(					 FILE *const outfile) const {  if(debugFlag) {    printf("xmdsIntegrateRK4IP::writePrototypes\n");  }  fprintf(outfile,"// ********************************************************\n");  fprintf(outfile,"// segment %li (RK4IP) prototypes\n",segmentNumber);  fprintf(outfile,"\n");  xmdsIntegrate::writePrototypes(outfile);  xmdsIntegrateIP::writePrototypes(outfile);  xmdsIntegrateRK4::writePrototypes(outfile);};// ******************************************************************************void xmdsIntegrateRK4IP::writeRoutines(				       FILE *const outfile) const {  if(debugFlag) {    printf("xmdsIntegrateRK4IP::writeRoutines\n");  }  fprintf(outfile,"// ********************************************************\n");  fprintf(outfile,"// segment %li (RK4IP) routines\n",segmentNumber);  fprintf(outfile,"\n");  xmdsIntegrate::writeRoutines(outfile);  xmdsIntegrateIP::writeRoutines(outfile);  xmdsIntegrateRK4::writeRoutines(outfile);};// ******************************************************************************void xmdsIntegrateRK4IP::writeSingleStepCode(					     FILE *const outfile,					     const stepCaseEnum& stepCase) const {  if(debugFlag) {    printf("xmdsIntegrateRK4IP::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* kStep="";  if(!constantK()) {    kStep="_step/2";  }  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_k=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	akfield_%s_main[_i1] = _%s_main[_i1];\n",indent,fieldName,fieldName);  fprintf(outfile,"\n");  if(usesKOperators()) {    fprintf(outfile,"%s// a=D[a]\n",indent);    fprintf(outfile,"%s_segment%li_k_propagate(%s);\n",indent,segmentNumber,kStep);    fprintf(outfile,"\n");    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_active_%s_main = akfield_%s_main;\n",indent,fieldName,fieldName);  fprintf(outfile,"\n");  fprintf(outfile,"%s// a_k=G[a_k,t]\n",indent);  fprintf(outfile,"%s_segment%li_calculate_delta_a(_step,cycle%s);\n",indent,segmentNumber,noiseVector);  fprintf(outfile,"\n");  if(usesKOperators()) {    fprintf(outfile,"%s// a_k=D[a_k]\n",indent);    fprintf(outfile,"%s_segment%li_k_propagate(%s);\n",indent,segmentNumber,kStep);    fprintf(outfile,"\n");    simulation()->field()->vectors2space(outfile,0,tempVectorNamesList,indent);  }  fprintf(outfile,"%s// a=a+a_k/6\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	_%s_main[_i1] += akfield_%s_main[_i1]/6;\n",indent,fieldName,fieldName);  fprintf(outfile,"\n");  fprintf(outfile,"%s// a_k = a_i + a_k/2\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	akfield_%s_main[_i1] = aifield_%s_main[_i1] + akfield_%s_main[_i1]/2;\n",indent,fieldName,fieldName,fieldName);  fprintf(outfile,"\n");  fprintf(outfile,"%s%s += _step/2;\n",indent,propDim);  fprintf(outfile,"\n");  fprintf(outfile,"%s// a_k=G[a_k,t+h/2]\n",indent);  fprintf(outfile,"%s_segment%li_calculate_delta_a(_step,cycle%s);\n",indent,segmentNumber,noiseVector);  fprintf(outfile,"\n");  fprintf(outfile,"%s// a=a+a_k/3\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	_%s_main[_i1] += akfield_%s_main[_i1]/3;\n",indent,fieldName,fieldName);  fprintf(outfile,"\n");  fprintf(outfile,"%s// a_k = a_i + a_k/2\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	akfield_%s_main[_i1] = aifield_%s_main[_i1] + akfield_%s_main[_i1]/2;\n",indent,fieldName,fieldName,fieldName);  fprintf(outfile,"\n");  fprintf(outfile,"%s// a_k=G[a_k,t+h/2]\n",indent);  fprintf(outfile,"%s_segment%li_calculate_delta_a(_step,cycle%s);\n",indent,segmentNumber,noiseVector);  fprintf(outfile,"\n");  fprintf(outfile,"%s// a=a+a_k/3\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	_%s_main[_i1] += akfield_%s_main[_i1]/3;\n",indent,fieldName,fieldName);  fprintf(outfile,"\n");  fprintf(outfile,"%s// a_k = a_i + a_k\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	akfield_%s_main[_i1] = aifield_%s_main[_i1] + akfield_%s_main[_i1];\n",indent,fieldName,fieldName,fieldName);  fprintf(outfile,"\n");  if(usesKOperators()) {    fprintf(outfile,"%s// a_k=D[a_k]\n",indent);    fprintf(outfile,"%s_segment%li_k_propagate(%s);\n",indent,segmentNumber,kStep);    fprintf(outfile,"\n");    simulation()->field()->vectors2space(outfile,0,tempVectorNamesList,indent);  }  fprintf(outfile,"%s%s += _step/2;\n",indent,propDim);  fprintf(outfile,"\n");  fprintf(outfile,"%s// a_k=G[a_k,t+h]\n",indent);  fprintf(outfile,"%s_segment%li_calculate_delta_a(_step,cycle%s);\n",indent,segmentNumber,noiseVector);  fprintf(outfile,"\n");  fprintf(outfile,"%s_active_%s_main = _%s_main;\n",indent,fieldName,fieldName);  fprintf(outfile,"\n");  if(usesKOperators()) {    fprintf(outfile,"%s// a=D[a]\n",indent);    fprintf(outfile,"%s_segment%li_k_propagate(%s);\n",indent,segmentNumber,kStep);    fprintf(outfile,"\n");    simulation()->field()->vectors2space(outfile,0,tempVectorNamesList,indent);  }  fprintf(outfile,"%s// a=a+a_k/6\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	_%s_main[_i1] += akfield_%s_main[_i1]/6;\n",indent,fieldName,fieldName);};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -