Hi Stone, I had to make a few fixes to get the forcing working again. Once you make the fixes below you should double check the results since we haven't used forcing with cgcns very much before. Regards, Bill ***Fix 1: File cg/cns/src/cns.C : move a block of code around line 3518 -------------------------------------------------------------------------------------------- if( debug() & 8 ) { fprintf(pDebugFile," ====== addForcingCNS t=%9.3e TZ=%i pdeVariation=%i ===== \n",t0, (int)parameters.dbase.get<bool >("twilightZoneFlow"),(int)pdeVariation); } Index I1,I2,I3; realArray & ut = dvdt; OV_GET_SERIAL_ARRAY(real,ut,utLocal); // --- Add on any user defined forcing --- if( parameters.dbase.get<bool >("turnOnBodyForcing") ) { // The body forcing will have already been computed. if( false ) printF("Cgcns::addForcing:turnOnBodyForcing=%i\n",(int) parameters.dbase.get<bool >("turnOnBodyForcing")); assert( parameters.dbase.get<realCompositeGridFunction* >("bodyForce")!=NULL ); realCompositeGridFunction & bodyForce = *(parameters.dbase.get<realCompositeGridFunction* >("bodyForce")); // // Compute the user defined forcing: // userDefinedForcing( userDefinedForce[grid], u, iparam, rparam ); // Add the user defined force onto dvdt: OV_GET_SERIAL_ARRAY(real,bodyForce[grid],bodyForceLocal); // printF("addForcing: add body force: (min,max)=(%g,%g)\n",min(bodyForceLocal),max(bodyForceLocal)); getIndex(mg.gridIndexRange(),I1,I2,I3); bool ok = ParallelUtility::getLocalArrayBounds(ut,utLocal,I1,I2,I3); const Range & Rt = parameters.dbase.get<Range >("Rt"); // time dependent components if( false ) printF("cns:getForcing: grid=%i, utLocal=[%i,%i][%i,%i], bodyForceLocal=[%i,%i][%i,%i]\n",grid, utLocal.getBase(0),utLocal.getBound(0), utLocal.getBase(1),utLocal.getBound(1), bodyForceLocal.getBase(0),bodyForceLocal.getBound(0), bodyForceLocal.getBase(1),bodyForceLocal.getBound(1)); utLocal(I1,I2,I3,Rt) += bodyForceLocal(I1,I2,I3,Rt); } // *wdh* 2013/08/31 -- put this after assigning the bodyForce // THIS NEXT BLOCK WAS MOVED FROM ABOVE if( !parameters.dbase.get<bool >("twilightZoneFlow") || conservativeGodunovMethod==CnsParameters::multiComponentVersion || (pde==CnsParameters::compressibleNavierStokes && pdeVariation==CnsParameters::conservativeGodunov) ) { parameters.dbase.get<RealArray>("timing")(parameters.dbase.get<int>("timeForForcing"))+=getCPU()-cpu0; return; } const int & rc = parameters.dbase.get<int >("rc"); const int & uc = parameters.dbase.get<int >("uc"); const int & vc = parameters.dbase.get<int >("vc"); const int & wc = parameters.dbase.get<int >("wc"); ------------------------------------------------------------------------------------------------- *** Fix 2: cg/common/src/addGrids.bC : add some lines around line 969 ------------------------------------------------------------------------------------------------ // updateToMatchNewGrid(cgNew,changes,gf0); updateWorkSpace(gf0); gf0.u.getOperators()->updateToMatchGrid(gf0.cg); gf0.u.setOperators(*gf0.u.getOperators()); // need to assign all components // update the body forcing *wdh* 2013/08/31 // START CHANGE if( parameters.dbase.get<bool >("turnOnBodyForcing") ) { realCompositeGridFunction *&bodyForce = parameters.dbase.get<realCompositeGridFunction* >("bodyForce"); (*bodyForce).updateToMatchGrid(gf0.cg); } // END CHANGE // *wdh* 070706 -- put this here instead of the routines that call this function real time2=getCPU(); gf0.cg.rcData->interpolant->updateToMatchGrid( gf0.cg ); time2=getCPU()-time2; time0+=time2; // do not include the time for updating the interpolant parameters.dbase.get<RealArray>("timing")(parameters.dbase.get<int>("timeForUpdateInterpolant"))+=time2; ---------------------------------------------------------------------------------------------------------- *** Fix 3: cg/common/src/userDefinedForcing.C : make a change around line 77 ---------------------------------------------------------------------------------------------------------- CompositeGrid & cg = gf.cg; realCompositeGridFunction & u = gf.u; const real t0 = gf.t; // ** here is the current time *** // There is no forcing to compute if none was specified or if the forcing is not time dependent and t>0 // For moving or AMR we always evaluate the forcing (for time independet forcing and AMR, we really // only to to re-eval when the grids change.) *wdh* 2013/08/31 // START CHANGE if( option==noForcing || ( !userDefinedForcingIsTimeDependent && t0>0. && !parameters.isAdaptiveGridProblem() && !parameters.isMovingGridProblem()) ) return 0; // END CHANGE const int & numberOfComponents=parameters.dbase.get<int >("numberOfComponents"); const int & numberOfDimensions=parameters.dbase.get<int >("numberOfDimensions"); -------------------------------------------------------------------------------------------------------- On 08/31/2013 09:58 AM, Shi Qiu wrote:
Hi Bill, Sorry to bother you again,After I applied the fix file, overture can run now, but it seems that the user defined forcing is ignored by overture. There is no forcing included in the calculation.(I have tried constant forcing and guassion forcing in a uniform flow, there is no change during each time step.)Thanks a lot. Best, Stone On Fri, Aug 30, 2013 at 8:01 PM, Bill Henshaw <henshaw@xxxxxxxx <mailto:henshaw@xxxxxxxx>> wrote: Hi Stone, Thanks for the files showing the bug. The fix to your problem is hopefully given below (it worked for me with my current version but it is possible I have changed something else too). The body forcing is applied to the equations in conservation form so that even though the variable appears a "tc" the forcing is really added to the total energy equation. Regards, Bill // ------------------------------------------------------------------------------- // ------ fix to cg/common/src/update.C around line 71 --- for( i=0; i<numberOfExtraFunctionsToUse; i++ ) { fn[i].updateToMatchGrid(cg); fn[i]=0.; // *wdh* 040316 - to avoid UMR's } // START FIX ***** update the body forcing ******* if( parameters.dbase.get<bool >("turnOnBodyForcing") ) { realCompositeGridFunction *&bodyForce = parameters.dbase.get<realCompositeGridFunction* >("bodyForce"); (*bodyForce).updateToMatchGrid(cg); } // **END FIX** } On 08/30/2013 01:24 PM, Shi Qiu wrote:Hi Bill, Attached is the cmd file I used for testing forcing function. I also attach a grid file for this cmd. Also I have another problem. In the version v24 user defined forcing file, whenever I want to set a certain temperature or a certain pressure in the file (for example, I set ug(I1,I2,I3,tc)=10 ) , but the actual result is always the number I set divided by 2.5 (10/2.5=4). Thanks a lot. Best. Stone On Fri, Aug 30, 2013 at 12:39 PM, Bill Henshaw <henshaw@xxxxxxxx <mailto:henshaw@xxxxxxxx>> wrote: Hi Stone, Can you send the commands you running (you will need to rename .cmd files to e.g. .cmdx in the eamil). There were numerous changes to the forcings in v25. Sorry for the problems. ...Bill On 08/30/2013 11:19 AM, Shi Qiu wrote:Hi All, I am trying to user defined forcing (which is gaussianForcing). It works fine in the version cg.v24 and overture.v24. But when I use */exactly the same/* cmd file to run it in version v25. It always gives me the same error as listed. And I also tried constant forcing and I got the same error in version v25. If anyone can give me an example cmd file which uses user defined forcing in version v25 will be very helpful to me. Here is the error, adaptGrids (end) step=0: number of array ID's has increased to 2028 ListOfDoubleMappedGridFunction: List Index Out of Range! trying to reference a list with index=10 but the list only has indicies in the range: [0,9] length of List = 10 ListOfDoubleMappedGridFunction: List Index Out of Range! Thanks a lot. Best, Stone