get_GOES_flux_grid Subroutine

public subroutine get_GOES_flux_grid(ixImin1, ixImin2, ixImin3, ixImax1, ixImax2, ixImax3, ixOmin1, ixOmin2, ixOmin3, ixOmax1, ixOmax2, ixOmax3, w, x, dV, xboxmin1, xboxmin2, xboxmin3, xboxmax1, xboxmax2, xboxmax3, xbmin1, xbmin2, xbmin3, xbmax1, xbmax2, xbmax3, fl, eflux_grid)

Uses

  • proc~~get_goes_flux_grid~~UsesGraph proc~get_goes_flux_grid get_GOES_flux_grid module~mod_global_parameters mod_global_parameters proc~get_goes_flux_grid->module~mod_global_parameters module~mod_basic_types mod_basic_types module~mod_global_parameters->module~mod_basic_types module~mod_connectivity mod_connectivity module~mod_global_parameters->module~mod_connectivity module~mod_constants mod_constants module~mod_global_parameters->module~mod_constants module~mod_physicaldata mod_physicaldata module~mod_global_parameters->module~mod_physicaldata module~mod_variables mod_variables module~mod_global_parameters->module~mod_variables mpi mpi module~mod_global_parameters->mpi module~mod_variables->module~mod_basic_types

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: ixImin1
integer, intent(in) :: ixImin2
integer, intent(in) :: ixImin3
integer, intent(in) :: ixImax1
integer, intent(in) :: ixImax2
integer, intent(in) :: ixImax3
integer, intent(in) :: ixOmin1
integer, intent(in) :: ixOmin2
integer, intent(in) :: ixOmin3
integer, intent(in) :: ixOmax1
integer, intent(in) :: ixOmax2
integer, intent(in) :: ixOmax3
double precision, intent(in) :: w(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,nw)
double precision, intent(in) :: x(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,1:ndim)
double precision, intent(in) :: dV(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3)
double precision, intent(in) :: xboxmin1
double precision, intent(in) :: xboxmin2
double precision, intent(in) :: xboxmin3
double precision, intent(in) :: xboxmax1
double precision, intent(in) :: xboxmax2
double precision, intent(in) :: xboxmax3
double precision, intent(in) :: xbmin1
double precision, intent(in) :: xbmin2
double precision, intent(in) :: xbmin3
double precision, intent(in) :: xbmax1
double precision, intent(in) :: xbmax2
double precision, intent(in) :: xbmax3
type(te_fluid), intent(in) :: fl
double precision, intent(out) :: eflux_grid

Calls

proc~~get_goes_flux_grid~~CallsGraph proc~get_goes_flux_grid get_GOES_flux_grid dexp dexp proc~get_goes_flux_grid->dexp

Called by

proc~~get_goes_flux_grid~~CalledByGraph proc~get_goes_flux_grid get_GOES_flux_grid proc~get_goes_sxr_flux get_GOES_SXR_flux proc~get_goes_sxr_flux->proc~get_goes_flux_grid

Source Code

    subroutine get_GOES_flux_grid(ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,&
       ixImax3,ixOmin1,ixOmin2,ixOmin3,ixOmax1,ixOmax2,ixOmax3,w,x,dV,xboxmin1,&
       xboxmin2,xboxmin3,xboxmax1,xboxmax2,xboxmax3,xbmin1,xbmin2,xbmin3,&
       xbmax1,xbmax2,xbmax3,fl,eflux_grid)
      use mod_global_parameters

      integer, intent(in)           :: ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,&
         ixImax3,ixOmin1,ixOmin2,ixOmin3,ixOmax1,ixOmax2,ixOmax3
      double precision, intent(in)  :: x(ixImin1:ixImax1,ixImin2:ixImax2,&
         ixImin3:ixImax3,1:ndim),dV(ixImin1:ixImax1,ixImin2:ixImax2,&
         ixImin3:ixImax3)
      double precision, intent(in)  :: w(ixImin1:ixImax1,ixImin2:ixImax2,&
         ixImin3:ixImax3,nw)
      double precision, intent(in)  :: xboxmin1,xboxmin2,xboxmin3,xboxmax1,&
         xboxmax2,xboxmax3,xbmin1,xbmin2,xbmin3,xbmax1,xbmax2,xbmax3
      type(te_fluid), intent(in) :: fl
      double precision, intent(out) :: eflux_grid

      integer :: ix1,ix2,ix3,ixO1,ixO2,ixO3,ixbmin1,ixbmin2,ixbmin3,ixbmax1,&
         ixbmax2,ixbmax3
      integer :: iE,numE,j,inbox
      double precision :: I0,kb,keV,dE,Ei,El,Eu,A_cgs
      double precision :: pth(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3),&
         Te(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3),&
         kbT(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3)
      double precision :: Ne(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3),&
         EM(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3)
      double precision :: gff,fi,erg_SI

      ! check whether the grid is inside given box
      inbox=0
      if (xbmin1<xboxmax1 .and. xbmax1>xboxmin1) inbox=inbox+1
      if (xbmin2<xboxmax2 .and. xbmax2>xboxmin2) inbox=inbox+1
      if (xbmin3<xboxmax3 .and. xbmax3>xboxmin3) inbox=inbox+1

      if (inbox==ndim) then
        ! indexes for cells inside given box
        ixbmin1=ixOmin1;ixbmin2=ixOmin2;ixbmin3=ixOmin3;
        ixbmax1=ixOmax1;ixbmax2=ixOmax2;ixbmax3=ixOmax3;
        if (xbmax1>xboxmax1) ixbmax1=ixOmax1-ceiling((xbmax1-&
           xboxmax1)/dxlevel(1))
        if (xbmax2>xboxmax2) ixbmax2=ixOmax2-ceiling((xbmax2-&
           xboxmax2)/dxlevel(2))
        if (xbmax3>xboxmax3) ixbmax3=ixOmax3-ceiling((xbmax3-&
           xboxmax3)/dxlevel(3))
        if (xbmin1<xboxmin1) ixbmin1=ceiling((xboxmin1-xbmin1)/dxlevel(1))+&
           ixOmin1
        if (xbmin2<xboxmin2) ixbmin2=ceiling((xboxmin2-xbmin2)/dxlevel(2))+&
           ixOmin2
        if (xbmin3<xboxmin3) ixbmin3=ceiling((xboxmin3-xbmin3)/dxlevel(3))+&
           ixOmin3

        I0=1.07d-38 !photon flux index for observed at 1AU [photon cm3,cm3,cm3 m-2,m-2,m-2 s-1,s-1,s-1 keV-1],keV-1],keV-1]
        kb=const_kb
        keV=1.0d3*const_ev
        erg_SI=1.d-7
        A_cgs=1.d-8 ! Angstrom
        El=const_h*const_c/(8.d0*A_cgs)/keV ! 8 A
        Eu=const_h*const_c/(1.d0*A_cgs)/keV ! 1 A
        dE=0.1  ! keV
        numE=floor((Eu-El)/dE)
        call fl%get_pthermal(w,x,ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,&
           ixImax3,ixbmin1,ixbmin2,ixbmin3,ixbmax1,ixbmax2,ixbmax3,pth)
        call fl%get_rho(w,x,ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,ixImax3,&
           ixbmin1,ixbmin2,ixbmin3,ixbmax1,ixbmax2,ixbmax3,Ne)
        call fl%get_var_Rfactor(w,x,ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,&
           ixImax3,ixbmin1,ixbmin2,ixbmin3,ixbmax1,ixbmax2,ixbmax3,Te)
        Te(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
           ixbmin3:ixbmax3)=pth(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
           ixbmin3:ixbmax3)/(Ne(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
           ixbmin3:ixbmax3)*Te(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
           ixbmin3:ixbmax3))*unit_temperature
        if (SI_unit) then
          Ne(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
             ixOmin3:ixOmax3)=Ne(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
             ixOmin3:ixOmax3)*unit_numberdensity/1.d6 !m-3,m-3,m-3 -> cm-3
          EM(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
             ixbmin3:ixbmax3)=(I0*(Ne(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
             ixbmin3:ixbmax3))**2)*dV(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
             ixbmin3:ixbmax3)*(unit_length*1.d2)**3 !cm-3,cm-3,cm-3
        else
          Ne(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
             ixOmin3:ixOmax3)=Ne(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
             ixOmin3:ixOmax3)*unit_numberdensity
          EM(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
             ixbmin3:ixbmax3)=(I0*(Ne(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
             ixbmin3:ixbmax3))**2)*dV(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
             ixbmin3:ixbmax3)*unit_length**3
        endif
        kbT(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
           ixbmin3:ixbmax3)=kb*Te(ixbmin1:ixbmax1,ixbmin2:ixbmax2,&
           ixbmin3:ixbmax3)/keV
        eflux_grid=0.0d0

        do iE=0,numE-1
          Ei=dE*iE+El
          do ix3=ixbmin3,ixbmax3
          do ix2=ixbmin2,ixbmax2
          do ix1=ixbmin1,ixbmax1
            if (kbT(ix1,ix2,ix3)>1.d-2*Ei) then
              if(kbT(ix1,ix2,ix3)<Ei) then
                gff=(kbT(ix1,ix2,ix3)/Ei)**0.4
              else
                gff=1.d0
              endif
              fi=(EM(ix1,ix2,ix3)*gff)*dexp(-Ei/(kbT(ix1,ix2,&
                 ix3)))/(Ei*dsqrt(kbT(ix1,ix2,ix3)))
              eflux_grid=eflux_grid+fi*dE*Ei
            endif
          enddo
          enddo
          enddo
        enddo
        eflux_grid=eflux_grid*keV*erg_SI
      endif

    end subroutine get_GOES_flux_grid