@@ -375,65 +375,74 @@ ERF::init_from_wrfinput (int lev)
375
375
int i_lo = geom[lev].Domain ().smallEnd (0 ); int i_hi = geom[lev].Domain ().bigEnd (0 );
376
376
int j_lo = geom[lev].Domain ().smallEnd (1 ); int j_hi = geom[lev].Domain ().bigEnd (1 );
377
377
378
- // Initialize Latitude
378
+ // Initialize Latitude & Coriolis factors
379
379
if ( var_name == " XLAT_V" ) {
380
- lat_m[lev] = std::make_unique<MultiFab>(ba2d,dm,1 ,ngv);
381
- for ( MFIter mfi (*(lat_m[lev]), TilingIfNotGPU ()); mfi.isValid (); ++mfi ) {
382
- Box gtbx = mfi.growntilebox ();
383
- const Array4< Real>& dst_arr = (lat_m[lev])->array (mfi);
384
- const Array4<const Real>& src_arr = var_fab.const_array ();
385
- ParallelFor (gtbx, [=] AMREX_GPU_DEVICE (int i, int j, int ) noexcept
386
- {
387
- int li = amrex::min (amrex::max (i, i_lo), i_hi);
388
- int lj = amrex::min (amrex::max (j, j_lo), j_hi);
389
- dst_arr (i,j,0 ) = src_arr (li,lj,0 );
390
- });
391
- }
380
+ solverChoice.has_lat_lon = true ;
381
+ lat_m[lev] = std::make_unique<MultiFab>(ba2d,dm,1 ,ngv);
382
+ sinPhi_m[lev] = std::make_unique<MultiFab>(ba2d,dm,1 ,ngv);
383
+ cosPhi_m[lev] = std::make_unique<MultiFab>(ba2d,dm,1 ,ngv);
384
+ for ( MFIter mfi (*(lat_m[lev]), TilingIfNotGPU ()); mfi.isValid (); ++mfi ) {
385
+ Box gtbx = mfi.growntilebox ();
386
+ const Array4< Real>& sin_arr = (sinPhi_m[lev])->array (mfi);
387
+ const Array4< Real>& cos_arr = (cosPhi_m[lev])->array (mfi);
388
+ const Array4< Real>& dst_arr = (lat_m[lev])->array (mfi);
389
+ const Array4<const Real>& src_arr = var_fab.const_array ();
390
+ ParallelFor (gtbx, [=] AMREX_GPU_DEVICE (int i, int j, int ) noexcept
391
+ {
392
+ int li = amrex::min (amrex::max (i, i_lo), i_hi);
393
+ int lj = amrex::min (amrex::max (j, j_lo), j_hi);
394
+ dst_arr (i,j,0 ) = src_arr (li,lj,0 );
395
+
396
+ Real lat_rad = dst_arr (i,j,0 ) * (PI/180 .);
397
+ sin_arr (i,j,0 ) = std::sin (lat_rad);
398
+ cos_arr (i,j,0 ) = std::cos (lat_rad);
399
+ });
400
+ }
392
401
}
393
402
394
403
// Initialize Longitude
395
404
if ( var_name == " XLONG_U" ) {
396
- lon_m[lev] = std::make_unique<MultiFab>(ba2d,dm,1 ,ngv);
397
- for ( MFIter mfi (*(lon_m[lev]), TilingIfNotGPU ()); mfi.isValid (); ++mfi ) {
398
- Box gtbx = mfi.growntilebox ();
399
- const Array4< Real>& dst_arr = (lon_m[lev])->array (mfi);
400
- const Array4<const Real>& src_arr = var_fab.const_array ();
401
- ParallelFor (gtbx, [=] AMREX_GPU_DEVICE (int i, int j, int ) noexcept
402
- {
403
- int li = amrex::min (amrex::max (i, i_lo), i_hi);
404
- int lj = amrex::min (amrex::max (j, j_lo), j_hi);
405
- dst_arr (i,j,0 ) = src_arr (li,lj,0 );
406
- });
407
- }
405
+ lon_m[lev] = std::make_unique<MultiFab>(ba2d,dm,1 ,ngv);
406
+ for ( MFIter mfi (*(lon_m[lev]), TilingIfNotGPU ()); mfi.isValid (); ++mfi ) {
407
+ Box gtbx = mfi.growntilebox ();
408
+ const Array4< Real>& dst_arr = (lon_m[lev])->array (mfi);
409
+ const Array4<const Real>& src_arr = var_fab.const_array ();
410
+ ParallelFor (gtbx, [=] AMREX_GPU_DEVICE (int i, int j, int ) noexcept
411
+ {
412
+ int li = amrex::min (amrex::max (i, i_lo), i_hi);
413
+ int lj = amrex::min (amrex::max (j, j_lo), j_hi);
414
+ dst_arr (i,j,0 ) = src_arr (li,lj,0 );
415
+ });
416
+ }
408
417
}
409
418
410
419
// Initialize Landmask
411
420
if ( var_name == " LANDMASK" ) {
412
- for ( MFIter mfi (*(lmask_lev[lev][0 ]), TilingIfNotGPU ()); mfi.isValid (); ++mfi ) {
413
- Box gtbx = mfi.growntilebox ();
414
- const Array4< int >& dst_arr = lmask_lev[lev][0 ]->array (mfi);
415
- const Array4<const Real>& src_arr = var_fab.const_array ();
416
- ParallelFor (gtbx, [=] AMREX_GPU_DEVICE (int i, int j, int ) noexcept
417
- {
418
- int li = amrex::min (amrex::max (i, i_lo), i_hi);
419
- int lj = amrex::min (amrex::max (j, j_lo), j_hi);
420
- dst_arr (i,j,0 ) = static_cast <int >(src_arr (li,lj,0 ));
421
- });
422
- }
423
- (lmask_lev[lev])[0 ]->FillBoundary (geom[lev].periodicity ());
421
+ for ( MFIter mfi (*(lmask_lev[lev][0 ]), TilingIfNotGPU ()); mfi.isValid (); ++mfi ) {
422
+ Box gtbx = mfi.growntilebox ();
423
+ const Array4< int >& dst_arr = lmask_lev[lev][0 ]->array (mfi);
424
+ const Array4<const Real>& src_arr = var_fab.const_array ();
425
+ ParallelFor (gtbx, [=] AMREX_GPU_DEVICE (int i, int j, int ) noexcept
426
+ {
427
+ int li = amrex::min (amrex::max (i, i_lo), i_hi);
428
+ int lj = amrex::min (amrex::max (j, j_lo), j_hi);
429
+ dst_arr (i,j,0 ) = static_cast <int >(src_arr (li,lj,0 ));
430
+ });
431
+ }
432
+ (lmask_lev[lev])[0 ]->FillBoundary (geom[lev].periodicity ());
424
433
}
425
434
426
435
// Initialize MapFac U
427
436
if ( var_name == " MAPFAC_UY" ) {
428
437
#ifdef _OPENMP
429
438
#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
430
439
#endif
431
- for ( MFIter mfi (*mapfac_u[lev], TilingIfNotGPU ()); mfi.isValid (); ++mfi )
432
- {
433
- // Define fabs for holding the initial data
434
- FArrayBox &msf_fab = (*mapfac_u[lev])[mfi];
435
- msf_fab.template copy <RunOn::Device>(var_fab);
436
- }
440
+ for ( MFIter mfi (*mapfac_u[lev], TilingIfNotGPU ()); mfi.isValid (); ++mfi )
441
+ {
442
+ // Define fabs for holding the initial data
443
+ FArrayBox &msf_fab = (*mapfac_u[lev])[mfi];
444
+ msf_fab.template copy <RunOn::Device>(var_fab);
445
+ }
437
446
}
438
447
439
448
// Initialize MapFac V
@@ -454,20 +463,20 @@ ERF::init_from_wrfinput (int lev)
454
463
#ifdef _OPENMP
455
464
#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
456
465
#endif
457
- for ( MFIter mfi (*mapfac_m[lev], TilingIfNotGPU ()); mfi.isValid (); ++mfi )
458
- {
459
- // Define fabs for holding the initial data
460
- FArrayBox &msf_fab = (*mapfac_m[lev])[mfi];
461
- msf_fab.template copy <RunOn::Device>(var_fab);
462
- }
466
+ for ( MFIter mfi (*mapfac_m[lev], TilingIfNotGPU ()); mfi.isValid (); ++mfi )
467
+ {
468
+ // Define fabs for holding the initial data
469
+ FArrayBox &msf_fab = (*mapfac_m[lev])[mfi];
470
+ msf_fab.template copy <RunOn::Device>(var_fab);
471
+ }
463
472
}
464
473
465
474
if (success) {
466
475
var_fab.clear ();
467
476
Print () << " DONE\n " ;
468
477
}
469
478
} // ivar
470
- Print () << " \n " ;
479
+ Print () << " \n " ;
471
480
} // idx
472
481
473
482
// Convert the velocities using the map factors
0 commit comments