Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
derived_couplings.C
Go to the documentation of this file.
1 /* *******************************************************************
2  * Rocstar Simulation Suite *
3  * Copyright@2015, Illinois Rocstar LLC. All rights reserved. *
4  * *
5  * Illinois Rocstar LLC *
6  * Champaign, IL *
7  * www.illinoisrocstar.com *
8  * sales@illinoisrocstar.com *
9  * *
10  * License: See LICENSE file in top level of distribution package or *
11  * http://opensource.org/licenses/NCSA *
12  *********************************************************************/
13 /* *******************************************************************
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES *
16  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *
17  * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR *
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
21  * USE OR OTHER DEALINGS WITH THE SOFTWARE. *
22  *********************************************************************/
23 // $Id: derived_couplings.C,v 1.74 2008/12/06 08:45:22 mtcampbe Exp $
24 
25 #include "rocman.h"
26 #include "derived_couplings.h"
27 #include "FluidAgent.h"
28 #include "SolidAgent.h"
29 #include "BurnAgent.h"
30 #include "basic_actions.h"
31 #include "transfer_actions.h"
32 #include "Interpolate.h"
33 
34 
35 /**************************************************************************
36  Fluid Solid Coupling with Farhat's Improved Staggered Scheme
37  (ISS method) without Burn
38 **************************************************************************/
39 
40 FluidSolidISS::FluidSolidISS(
41  const char *fluidmodule, const char *solidmodule,
42  MPI_Comm com,
44  const RocmanControl_parameters *mp):
45  Coupling("FluidSolidISS", fluidmodule, solidmodule, p, mp)
46 {
47  maxPredCorr = param->maxNumPredCorrCycles;
48 
49  // Create agents
50  FluidAgent *fluid_agent = new FluidAgent(this, normalize_modname(fluidmodule), fluidmodule, com, 1);
51  add_agent( fluid_agent);
52  const std::string fluidBufNG = fluid_agent->fluidBufNG;
53  const std::string fluid_propBufAll = fluid_agent->propBufAll;
54 
55  SolidAgent *solid_agent = new SolidAgent(this, normalize_modname(solidmodule), solidmodule, com, 1);
56  add_agent( solid_agent);
57  const std::string solidBuf = solid_agent->solidBuf;
58 
59  double zoom = 1.0;
60 
61  // ########### FLUID ############
62 
63  fluid_agent->add_bcinitaction( new GetDeformedMesh(fluid_agent, solid_agent,
64  solidBuf+".x", solidBuf+".uhat",
65  solidBuf+".nc"));
66 
67  fluid_agent->add_bcinitaction( new MeshMotionTransferISS(
68  fluid_agent, solid_agent,
69  solidBuf+".u", solidBuf+".vs",
70  fluidBufNG+".vm"));
71 
72  // fluid boundary conditions
73  fluid_agent->add_bcaction( new DummyAction(), 1);
74 
75 // fluid_agent->add_bcaction( new Extrapolate_Linear(fluid_agent,
76 // ifluid_i+".vs", "_alp"), 2);
77 
78  fluid_agent->add_gmaction( new ComputeMeshMotion( fluid_agent,
79  fluid_propBufAll+".vm",
80  fluid_agent->get_surface_window()+".du_alp",
81  zoom));
82 
83  // fluid main Physics routine
84  scheduler.add_action( fluid_agent->get_main_action());
85 
86  // ########### SOLID ############
87 
88  solid_agent->add_bcinitaction( new LoadTransfer_FS(fluid_agent, solid_agent,
89  fluidBufNG+".ts", solidBuf+".ts", solidBuf+".pf"));
90 
91  solid_agent->add_bcaction( new Interpolate_Constant(solid_agent, solid_agent,
92  solidBuf+".ts"), 1);
93 
94  // solid main physics routines
95  scheduler.add_action( solid_agent->get_main_action());
96 }
97 
98 
99 /**************************************************************************
100  Fully coupled with Burn Energy
101 **************************************************************************/
102 
103 SolidFluidBurnEnergySPC::SolidFluidBurnEnergySPC(
104  const char *fluidmodule, const char *solidmodule,
105  const char *burnmodule, MPI_Comm com,
107  FullyCoupling("SolidFluidBurnEnergySPC", fluidmodule, solidmodule, burnmodule, p, mp)
108 {
109  maxPredCorr = param->maxNumPredCorrCycles;
110 
111  // Create agents
112 
113  fluid_agent = new FluidAgent( this, normalize_modname(fluidmodule), fluidmodule, com, 1);
114  add_agent( fluid_agent);
115  const std::string ifluid_all = fluid_agent->ifluid_all;
116  const std::string fluid_propBufAll = fluid_agent->propBufAll;
117  const std::string fluidBufB = fluid_agent->fluidBufB;
118  const std::string fluidBufNB = fluid_agent->fluidBufNB;
119  const std::string fluidBufNG = fluid_agent->fluidBufNG;
120 
121  solid_agent = new SolidAgent( this, normalize_modname(solidmodule), solidmodule, com, 1);
122  add_agent( solid_agent);
123  const std::string solidBuf = solid_agent->solidBuf;
124  const std::string solid_propBufAll = solid_agent->propBufAll;
125  const std::string solid_propBuf = solid_agent->propBuf;
126 
127  burn_agent = new BurnAgent( this, "Rocburn", burnmodule, com, fluidBufB);
128  add_agent( burn_agent);
129  const std::string iburn_ng = burn_agent->iburn_ng;
130 
131  double zoom = 1.0; // ignore zoom for coupled simulation
132  int PROP_fom = mp->PROP_fom;
133 
134  // ########### INITIALIZATION ############
135 
136  // POST_INIT_SOLID
137  init_scheduler.add_action( new GetDeformedMesh(fluid_agent, solid_agent,
138  solidBuf+".x", solidBuf+".uhat",
139  solidBuf+".nc"));
140  // withALE POST_INIT_SOLID
141  std::string propBuf = solid_agent->propBufAll;
142  if (!PROP_fom) propBuf = solid_agent->propBuf;
143  init_scheduler.add_action( new ComputePconn(solid_agent,
144  solid_agent->propBufAll+".mesh",
145  solid_agent->propBufAll+".pconn",
146  propBuf+".pmesh", &solid_agent->withALE));
147  if (initial_start())
148  init_scheduler.add_action( new BCInvoker(solid_agent, 1));
149 
150  // POST_INIT_FLUID
151  if (initial_start()) {
152  init_scheduler.add_action( new CopyValue(fluidBufNG+".nc", fluidBufNG+".nc_t0"));
153  // INIT_INBUFF_FLUID called in POST_INIT_FLUID
154  init_scheduler.add_action( new BCInitInvoker( fluid_agent));
155  // UPDATE_INBUFF_GM_FLUID
156  init_scheduler.add_action( new GMInvoker( fluid_agent));
157  // UPDATE_INBUFF_BC_FLUID called in POST_INIT_FLUID
158  init_scheduler.add_action( new BCInvoker(fluid_agent, 1));
159  init_scheduler.add_action( new BCInvoker(fluid_agent, 2));
160  }
161 
162  if (initial_start()) {
163  // POST_UPDATE_FLUID
164  init_scheduler.add_action( new ComputeFluidLoad_ALE(
165  fluid_agent, solid_agent,
166  fluidBufNG+".pf", fluidBufB+".mdot",
167  iburn_ng+".rb",
168  fluidBufNG+".ts"));
169  // INIT_INBUFF_SOLID
170 /*
171  init_scheduler.add_action( new LoadTransfer_FSc_ALE(fluid_agent,
172  solid_agent, burn_agent,
173  fluidBufNG+".pf", fluidBufB+".mdot",
174  iburn_ng+".rb", solidBuf+".ts",
175  solidBuf+".pf"));
176 */
177  init_scheduler.add_action( new BCInitInvoker( solid_agent));
178 
179  // POST_UPDATE_SOLID
180  init_scheduler.add_action( new GetDeformedMesh_ALE(
181  fluid_agent, solid_agent,
182  solidBuf+".x", solidBuf+".uhat",
183  solidBuf+".nc", zoom));
184  }
185 
186  // ########### BURN ############
187 
188  // POST_INIT_BURN (IC)
189  if (initial_start()) {
190  burn_agent->add_icaction( new BCInitInvoker(burn_agent));
191  burn_agent->add_icaction( new BCInvoker(burn_agent));
192  burn_agent->add_icaction( new ComputeFaceCenters(burn_agent,
193  iburn_ng+".nc", iburn_ng+".centers"));
194  }
195 
196  burn_agent->add_bcinitaction( new CopyBurnFromParentMesh(burn_agent, fluid_agent));
197  burn_agent->add_bcinitaction( new TransferSolidDensity(fluid_agent,
198  solid_agent,
199  solidBuf+".rhos", fluidBufNG+".rhos"));
200 
201  burn_agent->add_bcaction( new Extrapolate_Linear(burn_agent, fluid_agent,
202  iburn_ng+".pf"));
203  burn_agent->add_bcaction( new Extrapolate_Central(burn_agent, fluid_agent,
204  iburn_ng+".qc", "_alp", 1));
205  burn_agent->add_bcaction( new Extrapolate_Central(burn_agent, fluid_agent,
206  iburn_ng+".qr", "_alp", 1));
207  burn_agent->add_bcaction( new Extrapolate_Linear(burn_agent, fluid_agent,
208  iburn_ng+".Tf", "_alp", 1));
209  burn_agent->add_bcaction( new Extrapolate_Linear(burn_agent, burn_agent,
210  iburn_ng+".rhos", "_alp", 1));
211 
212  // burn main Physics routine
213  scheduler.add_action( burn_agent->get_main_action());
214 
215  // ########### SOLID ############
216 
217  // INIT_INBUFF_SOLID()
218  solid_agent->add_bcinitaction( new HeatTransfer_FS(fluid_agent, solid_agent,
219  burn_agent,
220  fluidBufNG+".qc", fluidBufNG+".qr",
221  iburn_ng+".qev",
222  solidBuf+".qs"));
223 /*
224  solid_agent->add_bcinitaction( new LoadTransfer_FSc_ALE(fluid_agent,
225  solid_agent, burn_agent,
226  fluidBufNG+".pf", fluidBufB+".mdot",
227  iburn_ng+".rb", solidBuf+".ts",
228  solidBuf+".pf"));
229 */
230  solid_agent->add_bcinitaction( new LoadTransferOnly_FSc_ALE(fluid_agent,
231  solid_agent, burn_agent,
232  fluidBufNG+".ts",
233  solidBuf+".ts", solidBuf+".pf"));
234  solid_agent->add_bcinitaction( new TransferBurnRate_FS_ALE(
235  fluid_agent, solid_agent,
236  iburn_ng+".rb", solidBuf+".rb"));
237  solid_agent->add_bcinitaction( new SolidPropagateSurface_ALE( solid_agent,
238  solid_propBuf+".rb",
239  solid_propBufAll+".vbar", zoom));
240  solid_agent->add_bcinitaction( new CopyValue(solidBuf+".x", solidBuf+".nc",
241  &solid_agent->withALE));
242 
243  // INIT_INTERP_HANDLES() in "solid_agent.f90" // TODO: Change _alp as optional
244  solid_agent->add_bcaction( new Extrapolate_Linear(solid_agent, solid_agent,
245  solidBuf+".ts"), 1);
246  // for ALE
247  solid_agent->add_bcaction( new Extrapolate_Central(solid_agent, solid_agent,
248  solid_propBufAll+".vbar", "_alp", 1), 1);
249 
250  // solid main physics routines
251  scheduler.add_action( solid_agent->get_main_action());
252 
253  // ########### FLUID ############
254 
255  // POST_UPDATE_SOLID
256  fluid_agent->add_bcinitaction( new GetDeformedMesh_ALE(
257  fluid_agent, solid_agent,
258  solidBuf+".x", solidBuf+".uhat",
259  solidBuf+".nc", zoom));
260 
261  // INIT_INBUFF_FLUID
262  fluid_agent->add_bcinitaction( new SetZero( fluid_propBufAll+".vm"));
263  fluid_agent->add_bcinitaction( new TemperatureTransfer_SF(solid_agent,
264  fluid_agent,
265  solidBuf+".Ts",
266  iburn_ng+".Tflm", fluidBufNB+".Tb"));
267  fluid_agent->add_bcinitaction( new MeshMotionTransfer_SF(fluid_agent,
268  solid_agent,
269  solidBuf+".u", fluidBufNG+".total_disp",
270  fluidBufNG+".vm"));
272  fluid_agent, solid_agent,
273  solidBuf+".vs", fluidBufNG+".vs"));
274  fluid_agent->add_bcinitaction( new MassTransfer_SF_ALE(fluid_agent,
275  solid_agent, burn_agent,
276  fluidBufNG+".mdot"));
277  fluid_agent->add_bcinitaction( new CopyBflagFromBurn(burn_agent));
278 
279  // UPDATE_INBUFF_BC_FLUID
280  // Level-1 boundary condition:
281  fluid_agent->add_bcaction( new Interpolate_Linear(burn_agent, burn_agent,
282  iburn_ng+".Tflm"), 1);
283  fluid_agent->add_bcaction( new Interpolate_Linear(fluid_agent, fluid_agent,
284  fluidBufNB+".Tb"), 1);
285 
286  // Level-2 boundary condition
287  fluid_agent->add_bcaction( new Interpolate_Central(fluid_agent, fluid_agent,
288  fluidBufB+".mdot"), 2);
289  fluid_agent->add_bcaction( new Interpolate_Central(burn_agent, burn_agent,
290  iburn_ng+".rb"), 2);
291  fluid_agent->add_bcaction( new ZoomInterface( fluid_agent, burn_agent,
292  fluidBufB+".mdot_alp", zoom), 2);
293  fluid_agent->add_bcaction( new Interpolate_Linear(fluid_agent, fluid_agent,
294  fluidBufNG+".vs"), 2);
295  fluid_agent->add_bcaction( new ComputeRhofvf( fluid_agent,
296  fluidBufNG+".vs_alp",
297  fluidBufNG+".rhof_alp",
298  fluidBufNG+".rhofvf_alp"), 2);
299  fluid_agent->add_bcaction( new ComputeBurnPane( fluid_agent, burn_agent,
300  solid_agent,
301  fluidBufB+".mdot_alp",
302  fluidBufB+".rhofvf_alp",
303  zoom), 2);
304 
305  // UPDATE_INBUFF_GM_FLUID()
306  fluid_agent->add_gmaction( new ComputeMeshMotion( fluid_agent,
307  fluid_propBufAll+".vm",
308  fluid_agent->get_surface_window()+".du_alp",
309  zoom));
310 
311  // fluid main Physics routine
312  scheduler.add_action( fluid_agent->get_main_action());
313 
314  // POST_UPDATE_FLUID
315  scheduler.add_action( new ComputeFluidLoad_ALE( fluid_agent, solid_agent,
316  fluidBufNG+".pf", fluidBufB+".mdot",
317  iburn_ng+".rb",
318  fluidBufNG+".ts"));
319 
320 /*
321  scheduler.add_action( new LoadTransfer_FSc_ALE(fluid_agent,
322  solid_agent, burn_agent,
323  fluidBufNG+".pf", fluidBufB+".mdot",
324  iburn_ng+".rb", solidBuf+".ts",
325  solidBuf+".pf"));
326 */
327 }
328 
329 
330 
331 
332 
333 
334 
std::string ifluid_all
Definition: FluidAgent.h:69
std::string fluidBufB
Definition: FluidAgent.h:80
int withALE
Definition: SolidAgent.h:84
std::string propBufAll
Definition: FluidAgent.h:77
std::string propBuf
Definition: SolidAgent.h:70
void add_bcaction(Action *act, int l=1)
Definition: Agent.C:393
void add_bcinitaction(Action *act)
Definition: Agent.C:387
std::string get_surface_window() const
Definition: Agent.h:217
void add_gmaction(Action *act)
Definition: Agent.C:411
std::string fluidBufNG
Definition: FluidAgent.h:78
std::string solidBuf
Definition: SolidAgent.h:68
std::string propBufAll
Definition: SolidAgent.h:69
Action * get_main_action()
Definition: Agent.h:183
std::string fluidBufNB
Definition: FluidAgent.h:81