Source code for pynucastro.networks.fortran_network

"""A Fortran wrapper around the SimpleCxxNetwork"""


from pynucastro.networks.simple_cxx_network import SimpleCxxNetwork


[docs] class FortranNetwork(SimpleCxxNetwork): def __init__(self, *args, **kwargs): # Initialize SimpleCxxNetwork parent class super().__init__(*args, **kwargs) self.ftags['<nspec_fortran>'] = self._nspec_fortran self.ftags['<aion_fortran>'] = self._aion_fortran self.ftags['<zion_fortran>'] = self._zion_fortran self.ftags['<name_fortran>'] = self._name_fortran self.ftags['<indices_fortran>'] = self._indices_fortran def _get_template_files(self): path = self.pynucastro_dir/"templates/fortran-network" return path.glob("*.template") def _nspec_fortran(self, n_indent, of): of.write(f'{self.indent*n_indent}integer, parameter :: nspec = {len(self.unique_nuclei)}\n') def _aion_fortran(self, n_indent, of): of.write(f'{self.indent*n_indent}double precision, parameter :: aion(nspec) = [ &\n') for n, nuc in enumerate(self.unique_nuclei): if n % 4 == 0: of.write(' ') of.write(f'{nuc.A}') if n < len(self.unique_nuclei)-1: of.write(', ') if n % 4 == 3: of.write(' &\n') if len(self.unique_nuclei) % 4 == 0: of.write(' ') of.write(']\n') def _zion_fortran(self, n_indent, of): of.write(f'{self.indent*n_indent}double precision, parameter :: zion(nspec) = [ &\n') for n, nuc in enumerate(self.unique_nuclei): if n % 4 == 0: of.write(' ') of.write(f'{nuc.Z}') if n < len(self.unique_nuclei)-1: of.write(', ') if n % 4 == 3: of.write(' &\n') if len(self.unique_nuclei) % 4 == 0: of.write(' ') of.write(']\n') def _name_fortran(self, n_indent, of): of.write(f'{self.indent*n_indent}character(len=6), dimension(nspec) :: spec_names = [ &\n') for n, nuc in enumerate(self.unique_nuclei): if n == 0: of.write(' character(len=6) :: ') elif n % 4 == 0: of.write(' ') of.write(f'"{nuc.short_spec_name}"') if n < len(self.unique_nuclei)-1: of.write(', ') if n % 4 == 3: of.write(' &\n') if len(self.unique_nuclei) % 4 == 0: of.write(' ') of.write(']\n') def _indices_fortran(self, n_indent, of): # fortran doesn't allow leading underscores nor does it have # namespaces, so we'll use a trailing underscore to prevent # name clashes. for n, nuc in enumerate(self.unique_nuclei): of.write(f"{self.indent*n_indent}integer, parameter :: {nuc.short_spec_name}_ = {n+1}\n")