diff --git a/README.rst b/README.rst index 8a7f3d305..d51b95a7e 100644 --- a/README.rst +++ b/README.rst @@ -105,9 +105,12 @@ For further details see the `detailed building instructions `_. Parameterisations ================= -In order to carry out calculations with DFTB+, you need according -parameterisations (a.k.a. Slater-Koster files). You can download them from -`dftb.org `_. +In order to carry out calculations with the DFTB models, you need +suitable parameterisations (a.k.a. Slater-Koster files). You can +download them from `dftb.org `_. + +The shell variable *DFTBPLUS_PARAM_DIR* can be set to point to their +downloaded location (see the manual for details). Documentation diff --git a/doc/dftb+/manual/dftbp.tex b/doc/dftb+/manual/dftbp.tex index 6235d6294..f85727207 100644 --- a/doc/dftb+/manual/dftbp.tex +++ b/doc/dftb+/manual/dftbp.tex @@ -1695,6 +1695,9 @@ \subsection{Density Functional based Tight Binding} \item[\is{AtomSitePotential}] Specifies an external potential at an atom. See p.~\pref{sec:dftbp.AtomSitePotential}. +\item[\is{SpeciesPotential}] Specifies an external potential of a given species. + See p.~\pref{sec:dftbp.SpeciesPotential}. + \item[\is{Dispersion}] Specifies which kind of dispersion correction to apply. See p.~\pref{sec:dftbp.Dispersion}. @@ -3292,6 +3295,52 @@ \subsection{AtomSitePotential} } \end{verbatim} +\subsection{SpeciesPotential} +\label{sec:dftbp.SpeciesPotential} + +Specifies an external potential at atoms of given chemical +type(s). This potential either couples with the gross atomic charges +(charges printed in \verb|detailed.out| when {\is MullikenAnalysis} = +\is{Yes}) or net atomic charge (as printed when \is{WriteNetCharges} +is enabled). {\bf Note:} The sign convention is that the potential +will {\em increase} the energy of states associated with the affected +site for a {\em positive} potential. + +The \kw{Net} and \kw{Gross} potentials are specified as environments, both of +which have the following options +\begin{ptable} + \kw{Species} & s+ & & & \\ + \kw{Vext} & r & & & \\ +\end{ptable} + +\begin{description} +\item[\is{Species}] The chemical species for which an external + potential should be applied. +\item[\is{Vext}]\modif{\modtype{energy}} Specified strength of the + applied potential at the atoms of the listed species. +\end{description} + +Example: +\begin{verbatim} + SpeciesPotential { + # potential coupling to Mulliken charges on C and H atoms + Gross { + Species = C H + Vext [eV] = 1.5 + } + # potential coupling to Mulliken charges on O atoms + Gross { + Species = O + Vext [eV] = 1.4 + } + # on-site only part of potential for N atoms + Net { + Species = N + Vext [eV] = 0.5 + } + } +\end{verbatim} + \subsection{Dispersion} \label{sec:dftbp.Dispersion} diff --git a/src/dftbp/dftbplus/parser.F90 b/src/dftbp/dftbplus/parser.F90 index 47551347d..2c2521fb9 100644 --- a/src/dftbp/dftbplus/parser.F90 +++ b/src/dftbp/dftbplus/parser.F90 @@ -45,6 +45,7 @@ module dftbp_dftbplus_parser use dftbp_dftbplus_input_geoopt, only : readGeoOptInput use dftbp_dftbplus_inputconversion, only : transformpdosregioninfo use dftbp_dftbplus_inputdata, only : TBlacsOpts, TControl, THybridXcInp, TInputData, TSlater + use dftbp_math_duplicate, only : isRepeated use dftbp_dftbplus_oldcompat, only : convertOldHSD, minVersion, parserVersion, versionMaps use dftbp_dftbplus_specieslist, only : readSpeciesList use dftbp_elecsolvers_elecsolvers, only : electronicSolverTypes, providesEigenvalues @@ -2367,16 +2368,13 @@ subroutine readExternal(node, ctrl, geom) type(fnode), pointer :: value1, child, child2, child3 type(fnodeList), pointer :: children type(string) :: modifier, buffer, buffer2 - real(dp) :: rTmp, vTmp + real(dp) :: rTmp type(TFileDescr) :: file integer :: ind, ii, iErr, nElem - integer, allocatable :: tmpI1(:) real(dp), allocatable :: tmpR1(:), tmpR2(:,:) type(TListRealR2) :: lCharges type(TListRealR1) :: lBlurs, lr1 - type(TListReal) :: lr - type(TListInt) :: li - logical :: speciesPotentialPresent = .false., atomSitePotentialPresent = .false. + logical :: atomSitePotentialPresent call getChildValue(node, "ElectricField", value1, "", child=child, allowEmptyValue=.true.,& & dontMarkProcessed=.true., list=.true.) @@ -2498,6 +2496,7 @@ subroutine readExternal(node, ctrl, geom) end if + atomSitePotentialPresent = .false. call getChild(node, "AtomSitePotential", child, requested=.false.) if (associated(child)) then atomSitePotentialPresent = .true. @@ -2507,43 +2506,18 @@ subroutine readExternal(node, ctrl, geom) if (associated(child2)) then ! onsites ctrl%tNetAtomCharges = .true. - call init(li) - call init(lr) - call getChildValue(child2, "Atoms", li) - call getChildValue(child2, "Vext", lr, modifier=modifier, child=child3) - if (len(li) /= len(lr)) then - call detailedError(child2, "Mismatch in number of sites and potentials") - end if - allocate(ctrl%atomicExtPotential%iAtOnSite(len(li))) - call asArray(li, ctrl%atomicExtPotential%iAtOnSite) - allocate(ctrl%atomicExtPotential%VextOnSite(len(lr))) - call asArray(lr, ctrl%atomicExtPotential%VextOnSite) - call convertUnitHsd(char(modifier), energyUnits, child3, ctrl%atomicExtPotential%VextOnSite) - call destruct(li) - call destruct(lr) + call readExternalAtom_(child2, ctrl%atomicExtPotential%iAtOnSite,& + & ctrl%atomicExtPotential%VextOnSite) end if call getChild(child, "Gross", child2, requested=.false.) if (associated(child2)) then ! atomic - call init(li) - call init(lr) - call getChildValue(child2, "Atoms", li) - call getChildValue(child2, "Vext", lr, modifier=modifier, child=child3) - if (len(li) /= len(lr)) then - call detailedError(child2, "Mismatch in number of sites and potentials") - end if - allocate(ctrl%atomicExtPotential%iAt(len(li))) - call asArray(li, ctrl%atomicExtPotential%iAt) - allocate(ctrl%atomicExtPotential%Vext(len(lr))) - call asArray(lr, ctrl%atomicExtPotential%Vext) - call convertUnitHsd(char(modifier), energyUnits, child3, ctrl%atomicExtPotential%Vext) - call destruct(li) - call destruct(lr) + call readExternalAtom_(child2, ctrl%atomicExtPotential%iAt, ctrl%atomicExtPotential%Vext) end if - if (.not.allocated(ctrl%atomicExtPotential%iAt)& - & .and. .not.allocated(ctrl%atomicExtPotential%iAtOnSite)) then + if (.not.( allocated(ctrl%atomicExtPotential%iAt) .or.& + & allocated(ctrl%atomicExtPotential%iAtOnSite))) then call detailedError(child, "No atomic potentials specified") end if @@ -2552,53 +2526,131 @@ subroutine readExternal(node, ctrl, geom) call getChild(node, "SpeciesPotential", child, requested=.false.) if (associated(child)) then - speciesPotentialPresent = .true. + + ! Raise an error if both are present + if (atomSitePotentialPresent) then + call detailedError(node, "Only one of AtomSitePotential or SpeciesPotential can be present& + & in the input file") + end if allocate(ctrl%atomicExtPotential) - call getChild(child, "Net", child2, requested=.false.) - if (associated(child2)) then + call getChildren(child, "Net", children) + if (getLength(children) > 0) then ! onsites ctrl%tNetAtomCharges = .true. - call getChildValue(child2, "Species", buffer, child=child3, multiple=.true.) - call getSelectedAtomIndices(child3, char(buffer), geom%speciesNames, geom%species, tmpI1) - call getChildValue(child2, "Vext", vTmp, modifier=modifier, child=child3) - call convertUnitHsd(char(modifier), energyUnits, child3, vTmp) - - allocate(ctrl%atomicExtPotential%iAtOnSite(size(tmpI1))) - ctrl%atomicExtPotential%iAtOnSite = tmpI1 - allocate(ctrl%atomicExtPotential%VextOnSite(size(tmpI1))) - do ii = 1, size(tmpI1) - ctrl%atomicExtPotential%VextOnSite(ii) = vTmp + do ii = 1, getLength(children) + call getItem1(children, ii, child2) + call readExternalSpecies_(child2, geom, ctrl%atomicExtPotential%iAtOnSite,& + & ctrl%atomicExtPotential%VextOnSite) end do end if - call getChild(child, "Gross", child2, requested=.false.) - if (associated(child2)) then + call getChildren(child, "Gross", children) + if (getLength(children) > 0) then ! atomic - call getChildValue(child2, "Species", buffer, child=child3, multiple=.true.) - call getSelectedAtomIndices(child3, char(buffer), geom%speciesNames, geom%species, tmpI1) - call getChildValue(child2, "Vext", vTmp, modifier=modifier, child=child3) - call convertUnitHsd(char(modifier), energyUnits, child3, vTmp) - - allocate(ctrl%atomicExtPotential%iAt(size(tmpI1))) - ctrl%atomicExtPotential%iAt = tmpI1 - allocate(ctrl%atomicExtPotential%Vext(size(tmpI1))) - do ii = 1, size(tmpI1) - ctrl%atomicExtPotential%Vext(ii) = vTmp + do ii = 1, getLength(children) + write(*,*)'Gross', ii + call getItem1(children, ii, child2) + call readExternalSpecies_(child2, geom, ctrl%atomicExtPotential%iAt,& + & ctrl%atomicExtPotential%Vext) end do end if - end if - ! Raise an error if both are present - if (atomSitePotentialPresent .and. speciesPotentialPresent) then - call detailedError(node, "Only one of AtomSitePotential or SpeciesPotential can be present in& - & the input file") end if end subroutine readExternal + !> Read pairs of affected atoms and external potentials + subroutine readExternalAtom_(node, iAt, Vext) + + !> Relevant node in input tree + type(fnode), pointer :: node + + !> Affected atoms + integer, allocatable, intent(out) :: iAt(:) + + !> Potential at those atoms + real(dp), allocatable, intent(out) :: Vext(:) + + type(TListReal) :: lr + type(TListInt) :: li + type(fnode), pointer :: child, child2 + type(string) :: modifier + + call init(li) + call init(lr) + call getChildValue(node, "Atoms", li) + call getChildValue(node, "Vext", lr, modifier=modifier, child=child) + if (len(li) /= len(lr)) then + call detailedError(node, "Mismatch in number of sites and potentials") + end if + allocate(iAt(len(li))) + call asArray(li, iAt) + allocate(Vext(len(lr))) + call asArray(lr, Vext) + call convertUnitHsd(char(modifier), energyUnits, child, Vext) + call destruct(li) + call destruct(lr) + + end subroutine readExternalAtom_ + + + !> Read the affected species for an external potential + subroutine readExternalSpecies_(node, geom, iAt, Vext) + + !> Relevant node in input tree + type(fnode), pointer :: node + + !> Atomic geometry of the system, including atomic species information + type(TGeometry), intent(in) :: geom + + !> Affected atoms + integer, allocatable, intent(inout) :: iAt(:) + + !> Potential at those atoms + real(dp), allocatable, intent(inout) :: Vext(:) + + type(TListReal) :: lr + type(TListInt) :: li + type(fnode), pointer :: child, child2 + type(string) :: modifier, buffer + integer, allocatable :: tmpI1(:) + real(dp) :: vTmp + integer :: ii + integer, allocatable :: iAt_(:), iAtTmp(:) + real(dp), allocatable :: Vext_(:), VextTmp(:) + + @:ASSERT(allocated(iAt) .eqv. allocated(Vext)) + + call getChildValue(node, "Species", buffer, child=child, multiple=.true.) + call getSelectedAtomIndices(child, char(buffer), geom%speciesNames, geom%species, tmpI1) + call getChildValue(node, "Vext", vTmp, modifier=modifier, child=child) + call convertUnitHsd(char(modifier), energyUnits, child, vTmp) + allocate(iAt_(size(tmpI1)), source=tmpI1) + allocate(Vext_(size(tmpI1)), source=vTmp) + + if (.not.allocated(iAt)) then + call move_alloc(iAt_, iAt) + call move_alloc(Vext_, Vext) + else + allocate(iAtTmp(size(iAt)+size(iAt_)), source=0) + allocate(VextTmp(size(Vext)+size(Vext_)), source=0.0_dp) + iAtTmp(:size(iAt)) = iAt + VextTmp(:size(iAt)) = Vext + iAtTmp(size(iAt)+1:) = iAt_ + VextTmp(size(iAt)+1:) = Vext_ + call move_alloc(iAtTmp, iAt) + call move_alloc(VextTmp, Vext) + if (isRepeated(iAt)) then + call detailedError(node, "Repeated potentials for the same chemical species") + end if + end if + + end subroutine readExternalSpecies_ + + !> Filling of electronic levels subroutine readFilling(node, ctrl, geom, temperatureDefault) diff --git a/src/dftbp/extlibs/poisson.F90 b/src/dftbp/extlibs/poisson.F90 index f9a374860..8e590dedd 100644 --- a/src/dftbp/extlibs/poisson.F90 +++ b/src/dftbp/extlibs/poisson.F90 @@ -199,10 +199,10 @@ module dftbp_extlibs_poisson real(dp) :: gatePot !> Gate length along transport direction - real(dp) :: gateLength_l + real(dp) :: gateLength_l = 0.0_dp !> Gate length in transverse direction - real(dp) :: gateLength_t + real(dp) :: gateLength_t = 0.0_dp !> Insulator length real(dp) :: insLength diff --git a/src/dftbp/poisson/parameters.F90 b/src/dftbp/poisson/parameters.F90 index dc8a39402..7200d0144 100644 --- a/src/dftbp/poisson/parameters.F90 +++ b/src/dftbp/poisson/parameters.F90 @@ -122,79 +122,79 @@ end function DLAMCH ! ----------------------------------------------------------------- subroutine init_defaults() - verbose=0 - biasdir=0 - gatedir=0 - contdir(:)=0 - ncont=0 - ni(:)=0; ni(1)=1; - nf(:)=0; nf(1)=2; - iatc(:,:)=0 - iatm(:)=0 - ncdim(:)=0 - mbound_end(:)=0 - maxiter=30 - localBC=0 - poissBC=0 + verbose = 0 + biasdir = 0 + gatedir = 0 + contdir(:) = 0 + ncont = 0 + ni(:) = 0; ni(1) = 1; + nf(:) = 0; nf(1) = 2; + iatc(:,:) = 0 + iatm(:) = 0 + ncdim(:) = 0 + mbound_end(:) = 0 + maxiter = 30 + localBC = 0 + poissBC = 0 overrideBC(:) = poissonBCsEnum%periodic overrBulkBC(:) = poissonBCsEnum%unset mixed = .false. - maxpoissiter=60 - - Temp=0.0_dp - deltaR_max=9.0_dp - LmbMax=0.50_dp - gate=0.0_dp - GateLength_l=0.0_dp - GateLength_t=0.0_dp - OxLength=0.0_dp - OxLength_t=0.0_dp - OxLength_l=0.0_dp - insLength_t=0.0_dp - insLength_l=0.0_dp - Efermi(:)=0.0_dp - bias_dEf=0.0_dp - Rmin_Ins=0.0_dp - Rmin_Gate=0.0_dp + maxpoissiter = 60 + + Temp = 0.0_dp + deltaR_max = 9.0_dp + LmbMax = 0.50_dp + gate = 0.0_dp + GateLength_l = 0.0_dp + GateLength_t = 0.0_dp + OxLength = 0.0_dp + OxLength_t = 0.0_dp + OxLength_l = 0.0_dp + insLength_t = 0.0_dp + insLength_l = 0.0_dp + Efermi(:) = 0.0_dp + bias_dEf = 0.0_dp + Rmin_Ins = 0.0_dp + Rmin_Gate = 0.0_dp insSharpBC = .false. - dr_eps=0.0_dp - eps_r=0.0_dp - cntr_gate(:)=0.0_dp - cntr_gate_set(:)=.false. - tip_atom(:)=0.0_dp - base_atom1(:)=0.0_dp - base_atom2(:)=0.0_dp - tipbias=0.0_dp - DOS(:)=0.0_dp - delta=1e-4_dp - racc=DLAMCH('P') ! precision - PoissAcc=1e-5_dp - dmin(:)=0.50_dp - PoissBox(:,:)=0.0_dp - PoissPlane(:)=0.0_dp - mu(:)=0.0_dp - cntr_cont(:,:)=0.0_dp - R_cont(:)=0.0_dp - dR_cont(:)=1.0_dp + dr_eps = 0.0_dp + eps_r = 0.0_dp + cntr_gate(:) = 0.0_dp + cntr_gate_set(:) = .false. + tip_atom(:) = 0.0_dp + base_atom1(:) = 0.0_dp + base_atom2(:) = 0.0_dp + tipbias = 0.0_dp + DOS(:) = 0.0_dp + delta = 1e-4_dp + racc = DLAMCH('P') ! precision + PoissAcc = 1e-5_dp + dmin(:) = 0.50_dp + PoissBox(:,:) = 0.0_dp + PoissPlane(:) = 0.0_dp + mu(:) = 0.0_dp + cntr_cont(:,:) = 0.0_dp + R_cont(:) = 0.0_dp + dR_cont(:) = 1.0_dp bufferBox = 0.0_dp - etb=.false. - cluster=.false. - SavePot=.false. - SaveNNList=.false. - SaveHS=.false. - FictCont(:)=.false. - DoPoisson=.true. - Readold=.false. - InitPot=.false. - DoGate=.false. - DoInsulator=.false. - DoCilGate=.false. - DoTip=.false. - ReadBulk=.false. - FoundBox=.false. - do_renorm=.true. - fixed_renorm=.true. + etb = .false. + cluster = .false. + SavePot = .false. + SaveNNList = .false. + SaveHS = .false. + FictCont(:) = .false. + DoPoisson = .true. + Readold = .false. + InitPot = .false. + DoGate = .false. + DoInsulator = .false. + DoCilGate = .false. + DoTip = .false. + ReadBulk = .false. + FoundBox = .false. + do_renorm = .true. + fixed_renorm = .true. end subroutine @@ -300,7 +300,7 @@ subroutine set_poissonbox(Box) real(dp), intent(in) :: Box(:) integer i do i = 1, 3 - PoissBox(i,i)=box(i) + PoissBox(i,i) = box(i) end do end subroutine set_poissonbox diff --git a/src/dftbp/poisson/parcheck.F90 b/src/dftbp/poisson/parcheck.F90 index f1f923b74..928f88c73 100644 --- a/src/dftbp/poisson/parcheck.F90 +++ b/src/dftbp/poisson/parcheck.F90 @@ -155,19 +155,18 @@ end subroutine check_biasdir subroutine check_parameters() - - if(OxLength.lt.GateLength_l) OxLength=GateLength_l - print *,'Oxlength=',OxLength, 'GateLength_l=',GateLength_l + if (OxLength < GateLength_l) OxLength = GateLength_l + print *,'Oxlength=', OxLength, 'GateLength_l=', GateLength_l if (DoInsulator) then - if(Rmin_ins.le.0.0d0) then + if (Rmin_ins <= 0.0_dp) then call error('Insulator radius must be positive') end if - if(Rmin_ins.gt.Rmin_gate) then + if (Rmin_ins > Rmin_gate) then call warning('Insulator radius is larger than gate radius: setting Rmin_ins=Rmin_gate') - Rmin_ins=Rmin_gate + Rmin_ins = Rmin_gate end if - if(dr_eps.lt.0.5d0) dr_eps = 0.5d0 !TODO: should be changed to one grid spacing - print *,'dr_eps=',dr_eps + if (dr_eps < 0.5_dp) dr_eps = 0.5d0 !TODO: should be changed to one grid spacing + print *,'dr_eps=', dr_eps end if ! Check nPoles ---------------------------------------- diff --git a/test/app/dftb+/extpot/CH3OH_species/_autotest.tag b/test/app/dftb+/extpot/CH3OH_species/_autotest.tag new file mode 100644 index 000000000..e2f9d9dba --- /dev/null +++ b/test/app/dftb+/extpot/CH3OH_species/_autotest.tag @@ -0,0 +1,29 @@ +orbital_charges :real:2:4,6 + 0.121685878978165E+001 0.926530665281684E+000 0.870898153361266E+000 + 0.926530665281683E+000 0.691036470457824E+000 0.000000000000000E+000 + 0.000000000000000E+000 0.000000000000000E+000 0.949280730319607E+000 + 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 + 0.976525013378434E+000 0.000000000000000E+000 0.000000000000000E+000 + 0.000000000000000E+000 0.976525013378433E+000 0.000000000000000E+000 + 0.000000000000000E+000 0.000000000000000E+000 0.173381321294502E+001 + 0.157284314745860E+001 0.158631499089720E+001 0.157284314745860E+001 +forces :real:2:3,6 + -0.419357848158736E-003 -0.419357848157834E-003 -0.458894678784794E-003 + -0.495724927694063E-004 -0.495724927694063E-004 0.330425030434886E-003 + 0.629979132479794E-004 0.629979132480141E-004 0.992213013734783E-005 + 0.626124330229613E-004 -0.330592473244198E-004 0.117585495941583E-003 + -0.330592473244892E-004 0.626124330228642E-004 0.117585495941680E-003 + 0.376379241981702E-003 0.376379241980761E-003 -0.116623473670724E-003 +mermin_energy :real:0: + -0.653489373088521E+001 +end_coords :real:2:3,6 + 0.551009365105944E+000 0.551009365105944E+000 0.454533921204160E+000 + 0.306393378223258E+001 0.306393378223258E+001 0.151500528700923E+001 + -0.767924435088478E+000 -0.767924435088478E+000 0.137776941729405E+001 + -0.549444558603841E+000 0.185319017749382E+001 -0.771684252812615E+000 + 0.185319017749382E+001 -0.549444558603841E+000 -0.771684252812615E+000 + 0.189635879451802E+001 0.189635879451802E+001 0.235345703609416E+001 +dipole_moments :real:2:3,1 + 0.875589041805768E-001 0.875589041805752E-001 -0.567644023143264E+000 +scaled_dipole :real:2:3,1 + 0.875589041805768E-001 0.875589041805752E-001 -0.567644023143264E+000 diff --git a/test/app/dftb+/extpot/CH3OH_species/dftb_in.hsd b/test/app/dftb+/extpot/CH3OH_species/dftb_in.hsd new file mode 100644 index 000000000..21f31aa06 --- /dev/null +++ b/test/app/dftb+/extpot/CH3OH_species/dftb_in.hsd @@ -0,0 +1,57 @@ +Geometry = xyzFormat { + 6 +Methanol + C 0.29158162 0.29158162 0.24052901 3.94523911 + H 1.62136405 1.62136405 0.80170633 0.69494414 + H -0.40636814 -0.40636814 0.72908423 0.94919719 + H -0.29075356 0.98066608 -0.40835775 0.97628093 + H 0.98066608 -0.29075356 -0.40835775 0.97628093 + O 1.00350993 1.00350993 1.24539592 6.45805770 +} + +Hamiltonian = DFTB { + SCC = Yes + SCCTolerance = 1.0E-8 + SpeciesPotential { + Gross { + Species = C H + Vext [eV] = 1.5 + } + Gross { + Species = O + Vext [eV] = 1.4 + } + } + MaxAngularMomentum { + H = "s" + C = "p" + O = "p" + } + Charge = 0.0 + Filling = Fermi { + Temperature [Kelvin] = 100.0 + } + SlaterKosterFiles = Type2FileNames { + Prefix = {slakos/origin/mio-1-1/} + Separator = "-" + Suffix = ".skf" + } +} + +Options { + WriteAutotestTag = Yes +} + +Analysis { + PrintForces = Yes +} + +ParserOptions { + ParserVersion = 15 +} + +Parallel { + # Allow OMP threads explicitely to test for hybrid parallelisation with + # MPI-binary. (Check the manual before using this in production runs!) + UseOmpThreads = Yes +} diff --git a/test/app/dftb+/tests b/test/app/dftb+/tests index 802fcaa1a..d64c34a9a 100644 --- a/test/app/dftb+/tests +++ b/test/app/dftb+/tests @@ -12,6 +12,7 @@ extpot/CH4_net2 #? MPI_PROCS <= 1 extpot/CH4_scc_gross #? MPI_PROCS <= 1 extpot/CH4_scc_net #? MPI_PROCS <= 1 extpot/CH4_scc_species_pot #? MPI_PROCS <= 1 +extpot/CH3OH_species #? MPI_PROCS <= 1 deltadftb/C2H4 #? OMP_THREADS <= 2 and not WITH_MPI deltadftb/C2H4_noground #? OMP_THREADS <= 2 and not WITH_MPI