/* 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: xmdsintegrateark45ex.cc,v 1.3 2005/05/02 02:35:58 sebwuester Exp $ */ /*! @file xmdsintegrateark45ex.cc @brief Integrate element parsing classes and methods; fourth order Runge-Kutta in the explicit picture More detailed explanation... */ #include #include #include #include // ****************************************************************************** // ****************************************************************************** // xmdsIntegrateARK45EX public // ****************************************************************************** // ****************************************************************************** extern bool debugFlag; long nxmdsIntegrateARK45EXs=0; //!< The number of integrate ARK45EX objects // ****************************************************************************** xmdsIntegrateARK45EX::xmdsIntegrateARK45EX( const xmdsSimulation *const yourSimulation, const bool& yourVerboseMode) : xmdsIntegrate(yourSimulation,yourVerboseMode), xmdsIntegrateEX(yourSimulation,yourVerboseMode), xmdsIntegrateARK45(yourSimulation,yourVerboseMode) { if(debugFlag) { nxmdsIntegrateARK45EXs++; printf("xmdsIntegrateARK45EX::xmdsIntegrateARK45EX\n"); printf("nxmdsIntegrateARK45EXs=%li\n",nxmdsIntegrateARK45EXs); } }; // ****************************************************************************** xmdsIntegrateARK45EX::~xmdsIntegrateARK45EX() { if(debugFlag) { nxmdsIntegrateARK45EXs--; printf("xmdsIntegrateARK45EX::~xmdsIntegrateARK45EX\n"); printf("nxmdsIntegrateARK45EXs=%li\n",nxmdsIntegrateARK45EXs); } }; // ****************************************************************************** void xmdsIntegrateARK45EX::processElement( const Element *const yourElement) { if(debugFlag) { printf("xmdsIntegrateARK45EX::processElement\n"); } if(verbose()) { printf("Processing integrate ARK45EX element ...\n"); } xmdsIntegrate::processElement(yourElement); xmdsIntegrateARK45::processElement(yourElement); xmdsIntegrateEX::processElement(yourElement); }; // ****************************************************************************** // ****************************************************************************** // xmdsIntegrateARK45EX private // ****************************************************************************** // ****************************************************************************** // ****************************************************************************** void xmdsIntegrateARK45EX::writePrototypes( FILE *const outfile) const { if(debugFlag) { printf("xmdsIntegrateARK45EX::writePrototypes\n"); } const xmdsVector* mainVector; if(!simulation()->field()->getVector("main",mainVector)) { throw xmdsException("Internal error in xmdsIntegrateARKIP::writeResetRoutine: cannot find 'main' vector"); } const char* typeName=""; if(mainVector->vectorType()==COMPLEX) { typeName="complex"; } else if(mainVector->vectorType()==DOUBLE) { typeName="double"; } fprintf(outfile,"// ********************************************************\n"); fprintf(outfile,"// segment %li (ARK45EX) prototypes\n",segmentNumber); fprintf(outfile,"\n"); xmdsIntegrate::writePrototypes(outfile); xmdsIntegrateEX::writePrototypes(outfile); fprintf(outfile,"\n"); fprintf(outfile,"// integrate (ARK45EX) prototypes\n",segmentNumber); fprintf(outfile,"\n"); fprintf(outfile,"void _segment%li_reset(%s* _reset_to,double _step);\n",segmentNumber,typeName); xmdsIntegrateARK45::writePrototypes(outfile); }; // ****************************************************************************** void xmdsIntegrateARK45EX::writeRoutines( FILE *const outfile) const { if(debugFlag) { printf("xmdsIntegrateARK45EX::writeRoutines\n"); } fprintf(outfile,"// ********************************************************\n"); fprintf(outfile,"// segment %li (ARK45EX) routines\n",segmentNumber); fprintf(outfile,"\n"); xmdsIntegrate::writeRoutines(outfile); writeResetRoutine(outfile); xmdsIntegrateEX::writeRoutines(outfile); xmdsIntegrateARK45::writeRoutines(outfile); }; // ****************************************************************************** void xmdsIntegrateARK45EX::writeResetRoutine( FILE *const outfile) const { if(debugFlag) { printf("xmdsIntegrateARK45EX::writeResetRoutine\n"); } const char *const fieldName = simulation()->field()->name()->c_str(); const xmdsVector* mainVector; if(!simulation()->field()->getVector("main",mainVector)) { throw xmdsException("Internal error in xmdsIntegrateARK45::writeResetRoutine: cannot find 'main' vector"); } const char* typeName=""; if(mainVector->vectorType()==COMPLEX) { typeName="complex"; } else if(mainVector->vectorType()==DOUBLE) { typeName="double"; } fprintf(outfile,"/* **************************************************/\n"); fprintf(outfile,"void _segment%li_reset(%s* _reset_to,double _step){\n",segmentNumber,typeName); if(simulation()->parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"for(long _i1=0; _i1field()->name()->c_str(); const char *const propDim = simulation()->parameters()->propDimName.c_str(); list 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_k=y2=y1\n",indent); if(simulation()->parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1parameters()->usempi&!simulation()->parameters()->stochastic) { fprintf(outfile,"%sfor(long _i1=0; _i1t+dt\n",indent); fprintf(outfile,"%s%s -= a[6]*_step;\n",indent,propDim); fprintf(outfile,"\n"); fprintf(outfile,"%s_active_%s_main = _%s_main;\n",indent,fieldName,fieldName); fprintf(outfile,"\n"); };