#include "site-stuff.h" #include "run-time.h" /// Run-time common block defined in run-time.inc extern RTime RTIME; #include #include "ION.h" #include "ion_variables.h" #ifdef LC_UNSC #define IONINIT ioninit_ #define ION_FORTRAN_ARRAYS ion_fortran_arrays_ #define IONOSF ionosf_ #elif LC_NOUNSC #define IONINIT ioninit #define ION_FORTRAN_ARRAYS ion_fortran_arrays #define IONOSF ionosf #endif /// Defined in ionosphere.F extern "C" void IONOSF(); /// Defeind in ion_fortran_arrays.F extern "C" void ION_FORTRAN_ARRAYS(FLoaT **, int*); /// Defeind in ionosphere.F extern "C" void IONINIT(); ///Constructor /** * constructor to initialize the parallel arrays. This routine sets * up the partitioning for variables * * @param ni * @param nj * @param nk * @param ion_pe - Process which handles ionosphere * @param n_order * @param nion_i - number of ionosphere gridpoints in i direction * @param nion_j - number of ionosphere gridpoints in j direction */ ION::ION(int ni, int nj, int nk, Range ion_pe, int n_order, int nion_i, int nion_j): X(ni+1,nj+1,nk+1), Y(ni+1,nj+1,nk+1), Z(ni+1,nj+1,nk+1), Bx(ni+1,nj+1,nk+1),By(ni+1,nj+1,nk+1),Bz(ni+1,nj+1,nk+1), Rho(ni+1,nj+1,nk+1),Csound(ni+1,nj+1,nk+1),Ej_pot(ni+1,nj+1,nk+1),Ek_pot(ni+1,nj+1,nk+1), Vx_pot(ni+1,nj+1,nk+1),Vy_pot(ni+1,nj+1,nk+1),Vz_pot(ni+1,nj+1,nk+1), J0(nj+1,nk+1), Rho0(nj+1,nk+1), C0(nj+1,nk+1), X2ion(nj+1,nk/2+3), Y2ion(nj+1,nk/2+3), X_interp(nion_i,nion_j),Y_interp(nion_i,nion_j), J1_interp_N(nion_i,nion_j),Phi_N(nion_i,nion_j),Sigma_H_N(nion_i,nion_j), Sigma_P_N(nion_i,nion_j),Flux_N(nion_i,nion_j),Av_Energy_N(nion_i,nion_j), J1_interp_S(nion_i,nion_j),Phi_S(nion_i,nion_j),Sigma_H_S(nion_i,nion_j), Sigma_P_S(nion_i,nion_j),Flux_S(nion_i,nion_j),Av_Energy_S(nion_i,nion_j), ION_3D(ion_pe), ION_3D_GUARD(ion_pe), ION_2D(ion_pe) { NI = ni; NJ = nj; NK = nk; NO = n_order; NO2=NO/2; Nion_I=nion_i; Nion_J=nion_j; // define the partitioning for transfer back and forth to MHD ION_3D_GUARD.partitionAlongAxis(0,TRUE,NO2); ION_3D_GUARD.partitionAlongAxis(1,TRUE,NO2); ION_3D_GUARD.partitionAlongAxis(2,FALSE,NO2); X.setBase(1); Y.setBase(1); Z.setBase(1); Bx.setBase(1); By.setBase(1); Bz.setBase(1); Rho.setBase(1); Csound.setBase(1); Ej_pot.setBase(1); Ek_pot.setBase(1); Vx_pot.setBase(1); Vy_pot.setBase(1); Vz_pot.setBase(1); J0.setBase(1); Rho0.setBase(1); C0.setBase(1); X2ion.setBase(1); Y2ion.setBase(1); X_interp.setBase(1);Y_interp.setBase(1); J1_interp_N.setBase(1);Phi_N.setBase(1);Sigma_H_N.setBase(1); Sigma_P_N.setBase(1);Flux_N.setBase(1);Av_Energy_N.setBase(1); J1_interp_S.setBase(1);Phi_S.setBase(1);Sigma_H_S.setBase(1); Sigma_P_S.setBase(1);Flux_S.setBase(1);Av_Energy_S.setBase(1); // X.partition(ION_3D); Y.partition(ION_3D); Z.partition(ION_3D); Bx.partition(ION_3D); By.partition(ION_3D); Bz.partition(ION_3D); Rho.partition(ION_3D); Csound.partition(ION_3D); Ej_pot.partition(ION_3D); Ek_pot.partition(ION_3D); Vx_pot.partition(ION_3D); Vy_pot.partition(ION_3D); Vz_pot.partition(ION_3D); J0.partition(ION_2D); Rho0.partition(ION_2D); C0.partition(ION_2D); X2ion.partition(ION_2D); Y2ion.partition(ION_2D); X_interp.partition(ION_2D);Y_interp.partition(ION_2D); J1_interp_N.partition(ION_2D);Phi_N.partition(ION_2D);Sigma_H_N.partition(ION_2D); Sigma_P_N.partition(ION_2D);Flux_N.partition(ION_2D);Av_Energy_N.partition(ION_2D); J1_interp_S.partition(ION_2D);Phi_S.partition(ION_2D);Sigma_H_S.partition(ION_2D); Sigma_P_S.partition(ION_2D);Flux_S.partition(ION_2D);Av_Energy_S.partition(ION_2D); J0 = 0.; Rho0 = 0.; C0 = 0.; X2ion = 0.; Y2ion = 0.; X_interp = 0.; Y_interp = 0.; J1_interp_N = 0.; Phi_N = 0.; Sigma_H_N = 0.; Sigma_P_N = 0.; Flux_N = 0.; Av_Energy_N = 0.; J1_interp_S = 0.; Phi_S = 0.; Sigma_H_S = 0.; Sigma_P_S = 0.; Flux_S = 0.; Av_Energy_S = 0.; } /// initial /** * Setup variables in C++ ION class & call ION_FORTRAN_ARRAYS (defined * in ion_fortran_arrays.F) * * @param Process id which handles ionosphere */ void ION::initial(int ionpe) { #ifdef DEBUG_MODE_ON printf("DEBUG: process (%d) in ION.C::ION::initial()\n", RTIME.local_proc); #endif FLoaT *variable[100]; int ion_proc; // use variables.h to get the indices for the arrays variable[ _i_x] = X.getDataPointer(); variable[ _i_y] = Y.getDataPointer(); variable[ _i_z] = Z.getDataPointer(); variable[ _i_bx] = Bx.getDataPointer(); variable[ _i_by] = By.getDataPointer(); variable[ _i_bz] = Bz.getDataPointer(); variable[ _i_vx_pot] = Vx_pot.getDataPointer(); variable[ _i_vy_pot] = Vy_pot.getDataPointer(); variable[ _i_vz_pot] = Vz_pot.getDataPointer(); variable[ _i_rho] = Rho.getDataPointer(); variable[ _i_csound] = Csound.getDataPointer(); variable[ _i_ej_pot] = Ej_pot.getDataPointer(); variable[ _i_ek_pot] = Ek_pot.getDataPointer(); variable[_i_J0 ] = J0.getDataPointer(); variable[_i_x2ion ] = X2ion.getDataPointer(); variable[_i_y2ion ] = Y2ion.getDataPointer(); variable[_i_x_interp ] = X_interp.getDataPointer(); variable[_i_y_interp ] = Y_interp.getDataPointer(); variable[_i_j1_interp_n ] = J1_interp_N.getDataPointer(); variable[_i_phi_n ] = Phi_N.getDataPointer(); variable[_i_sigma_h_n ] = Sigma_H_N.getDataPointer(); variable[_i_sigma_p_n ] = Sigma_P_N.getDataPointer(); variable[_i_flux_n ] = Flux_N.getDataPointer(); variable[_i_av_energy_n ] = Av_Energy_N.getDataPointer(); variable[_i_j1_interp_s ] = J1_interp_S.getDataPointer(); variable[_i_phi_s ] = Phi_S.getDataPointer(); variable[_i_sigma_h_s ] = Sigma_H_S.getDataPointer(); variable[_i_sigma_p_s ] = Sigma_P_S.getDataPointer(); variable[_i_flux_s ] = Flux_S.getDataPointer(); variable[_i_av_energy_s ] = Av_Energy_S.getDataPointer(); variable[_i_rhoion0 ] = Rho0.getDataPointer(); variable[_i_cion0 ] = C0.getDataPointer(); ion_proc = FALSE; int mype = Communication_Manager::My_Process_Number; if (mype == ionpe){ ion_proc=TRUE; ION_PROCESSOR=TRUE; } ION_FORTRAN_ARRAYS(variable,&ion_proc); } /* void initial(int); */ /// Ionospherre initialization /** * Calls Fortran initialization of Ionosphere * ionosphere solver defined in ionosphere.F */ void ION::startup() { #ifdef DEBUG_MODE_ON printf("DEBUG: process (%d) in ION.C::ION::startup()\n", RTIME.local_proc); #endif if (ION_PROCESSOR) IONINIT(); } /// Step the ionosphere solver forward /** * Calls Fortran Ionosphere ionosphere solver to perform one step. * ionosf defined in ionosphere.F */ void ION::step() { #ifdef DEBUG_MODE_ON printf("DEBUG: process (%d) in ION.C::ION::step()\n", RTIME.local_proc); #endif if (ION_PROCESSOR) IONOSF(); }