Пример #1
0
    def __init__(self, pos, time, Kp, coord_system = 'GSM', INTERNAL_MODEL='LGM_IGRF',):
        # pos must be a Lgm_Vector or list of Lgm_Vectors
        super(Lgm_T89c, self).__init__(Position=pos, Epoch=time, Kp=Kp, coord_system = coord_system, INTERNAL_MODEL=INTERNAL_MODEL,)

        if not isinstance(pos, Lgm_Vector.Lgm_Vector) and \
            not isinstance(pos, list):
            raise(TypeError('pos must be a Lgm_Vector or list of Lgm_vectors') )
        self._Vpos = pos2Lgm_Vector(pos)

        # time must be a datetime
        if not isinstance(time, datetime.datetime) and \
            not isinstance(time, list):
            raise(TypeError('time must be a datetime or list of datetime') )

        try:
            for val in Kp:
                if val < 0 or val > 5:
                    raise(ValueError('T89c is only defined for integer Kp from 0 to 5') )
        except TypeError:
            if Kp < 0 or Kp > 5:
                raise(ValueError('T89c is only defined for integer Kp from 0 to 5') )

        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF'):
            raise(ValueError('INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, or LGM_IGRF') )
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        if coord_system != 'GSM':
            raise(NotImplementedError('Different coord systems are not yet ready to use') )

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()
        
        # and actually set the internal model in Lgm
        if self.attrs['internal_model'] == LGM_CDIP:
            Lgm_Set_Lgm_B_cdip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_EDIP:
            Lgm_Set_Lgm_B_edip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_IGRF:
            Lgm_Set_Lgm_B_IGRF_InternalModel(pointer(self._mmi))

        # either they are all one element or they are compatible lists no 1/2 way
        try:
            if len(self._Vpos) != len(self['Kp']) or \
                len(self._Vpos) != len(self['Epoch']) or \
                len(self['Epoch']) != len(self['Kp']):
                raise(ValueError('Inputs must be the same length, scalars or lists'))
        except TypeError:
            if isinstance(self._Vpos, list) and not isinstance(self['Kp'], list) \
                and not isinstance(self['Epoch'], list):
                    raise(ValueError('Inputs must be the same length, scalars or lists'))

        #self.data = T89_Data(pos, time, Kp, coord_system, INTERNAL_MODEL)
        self['B'] = self.calc_B()
Пример #2
0
    def __init__(
        self,
        pos,
        time,
        coord_system='GSM',
        INTERNAL_MODEL='LGM_IGRF',
    ):
        super(Lgm_OP77, self).__init__(
            Position=pos,
            Epoch=time,
            coord_system=coord_system,
            INTERNAL_MODEL=INTERNAL_MODEL,
        )

        # pos must be an Lgm_Vector or list or sensible ndarray
        try:
            self._Vpos = pos2Lgm_Vector(pos)
            assert self._Vpos
        except AssertionError:
            raise (
                TypeError('pos must be a Lgm_Vector or list of Lgm_vectors'))

        # time must be a datetime
        if not isinstance(time, datetime.datetime) and \
            not isinstance(time, list):
            raise (TypeError('time must be a datetime or list of datetime'))

        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF'):
            raise (ValueError(
                'INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, or LGM_IGRF'))
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        if coord_system != 'GSM':
            raise (NotImplementedError(
                'Different coord systems are not yet ready to use'))

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()

        # either they are all one element or they are compatible lists no 1/2 way
        try:
            if len(self._Vpos) != len(self['Epoch']):
                raise (ValueError(
                    'Inputs must be the same length, scalars or lists'))
        except TypeError:
            if isinstance(self._Vpos,
                          list) and not isinstance(self['Epoch'], list):
                raise (ValueError(
                    'Inputs must be the same length, scalars or lists'))

        self['B'] = self.calc_B()
Пример #3
0
    def __init__(self, pos, time, P, Dst, By, Bz, W, coord_system = 'GSM', INTERNAL_MODEL='LGM_IGRF',):
        #            parmod[1]  = Info->P; 	// Pressure in nPa
        #            parmod[2]  = Info->Dst;     // Dst in nPa
        #            parmod[3]  = Info->By; 	// IMF By in nT
        #            parmod[4]  = Info->Bz; 	// IMF Bz in nT
        #            parmod[5]  = Info->W[0];   // W1
        #            parmod[6]  = Info->W[1];   // W2
        #            parmod[7]  = Info->W[2];   // W3
        #            parmod[8]  = Info->W[3];   // W4
        #            parmod[9]  = Info->W[4];   // W5
        #            parmod[10] = Info->W[5];   // W6
        # pos must be a Lgm_Vector or list of Lgm_Vectors
        super(Lgm_TS04, self).__init__(Position=pos, Epoch=time, P=P, Dst=Dst, By=By, Bz=Bz, W=W, coord_system = coord_system, INTERNAL_MODEL=INTERNAL_MODEL,)

        if not isinstance(pos, Lgm_Vector.Lgm_Vector) and \
            not isinstance(pos, list):
            raise(TypeError('pos must be a Lgm_Vector or list of Lgm_vectors') )
        self._Vpos = pos2Lgm_Vector(pos)

        # time must be a datetime
        if not isinstance(time, datetime.datetime) and \
            not isinstance(time, list):
            raise(TypeError('time must be a datetime or list of datetime') )

        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF'):
            raise(ValueError('INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, or LGM_IGRF') )
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        if coord_system != 'GSM':
            raise(NotImplementedError('Different coord systems are not yet ready to use') )

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()

        # and actually set the internal model in Lgm
        if self.attrs['internal_model'] == LGM_CDIP:
            Lgm_Set_Lgm_B_cdip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_EDIP:
            Lgm_Set_Lgm_B_edip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_IGRF:
            Lgm_Set_Lgm_B_IGRF_InternalModel(pointer(self._mmi))

        #self.data = T89_Data(pos, time, Kp, coord_system, INTERNAL_MODEL)
        self['B'] = self.calc_B()
Пример #4
0
    def __init__(self, pos, time, coord_system = 'GSM', INTERNAL_MODEL='LGM_DUNGEY',):
        super(Lgm_Dungey, self).__init__(Position=pos, Epoch=time, coord_system = coord_system, INTERNAL_MODEL=INTERNAL_MODEL,)

        # pos must be an Lgm_Vector or list or sensible ndarray
        try:
            if coord_system != 'GSM':
                pos = magcoords.coordTrans(pos, time, coord_system,'GSM')
                #raise(NotImplementedError('Different coord systems are not yet ready to use') )
            else:
                pass
            self._Vpos = pos2Lgm_Vector(pos)
            assert self._Vpos
        except AssertionError:
            raise(TypeError('pos must be a Lgm_Vector or list of Lgm_vectors') )

        # time must be a datetime
        if not isinstance(time, datetime.datetime) and \
            not isinstance(time, list):
            raise(TypeError('time must be a datetime or list of datetime') )

        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF,
                                  LGM_DUNGEY) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF',
                                  'LGM_DUNGEY'):
            raise(ValueError('INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, LGM_DUNGEY, or LGM_IGRF') )
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()
        self._mmi.InternalModel = INTERNAL_MODEL
        self._mmi.ExternalModel = LGM_EXTMODEL_NULL

        # either they are all one element or they are compatible lists no 1/2 way
        try:
            if len(self._Vpos) != len(self['Epoch']):
                raise(ValueError('Inputs must be the same length, scalars or lists'))
        except TypeError:
            if isinstance(self._Vpos, list) and not isinstance(self['Epoch'], list):
                raise(ValueError('Inputs must be the same length, scalars or lists'))

        self['B'] = self.calc_B()
Пример #5
0
    def __init__(self, pos, time, coord_system = 'GSM', INTERNAL_MODEL='LGM_IGRF', verbose=False):
        super(Lgm_TS04_QD, self).__init__(Position=pos, Epoch=time)

        self.verbose = verbose

        if not isinstance(pos, (Lgm_Vector.Lgm_Vector, list, np.ndarray)):
            raise(TypeError('pos must be a Lgm_Vector or list of Lgm_vectors') )
        self._Vpos = pos2Lgm_Vector(pos)

        # time must be a datetime
        if not isinstance(time, (datetime.datetime, list)):
            raise(TypeError('time must be a datetime or list of datetime') )

        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF'):
            raise(ValueError('INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, or LGM_IGRF') )
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        if coord_system != 'GSM':
            raise(NotImplementedError('Different coord systems are not yet ready to use') )

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()

        # and actually set the internal model in Lgm
        if self.attrs['internal_model'] == LGM_CDIP:
            Lgm_Set_Lgm_B_cdip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_EDIP:
            Lgm_Set_Lgm_B_edip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_IGRF:
            Lgm_Set_Lgm_B_IGRF_InternalModel(pointer(self._mmi))

        #self.data = T89_Data(pos, time, Kp, coord_system, INTERNAL_MODEL)
        self['B'] = self.calc_B()
Пример #6
0
    def __init__(
        self,
        pos,
        time,
        Kp,
        coord_system='GSM',
        INTERNAL_MODEL='LGM_IGRF',
    ):
        # pos must be a Lgm_Vector or list of Lgm_Vectors
        super(Lgm_T89c, self).__init__(
            Position=pos,
            Epoch=time,
            Kp=Kp,
            coord_system=coord_system,
            INTERNAL_MODEL=INTERNAL_MODEL,
        )

        if not isinstance(pos, Lgm_Vector.Lgm_Vector) and \
            not isinstance(pos, list):
            raise (
                TypeError('pos must be a Lgm_Vector or list of Lgm_vectors'))
        self._Vpos = pos2Lgm_Vector(pos)

        # time must be a datetime
        if not isinstance(time, datetime.datetime) and \
            not isinstance(time, list):
            raise (TypeError('time must be a datetime or list of datetime'))

        try:
            for val in Kp:
                if val < 0 or val > 5:
                    raise (ValueError(
                        'T89c is only defined for integer Kp from 0 to 5'))
        except TypeError:
            if Kp < 0 or Kp > 5:
                raise (ValueError(
                    'T89c is only defined for integer Kp from 0 to 5'))

        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF'):
            raise (ValueError(
                'INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, or LGM_IGRF'))
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        if coord_system != 'GSM':
            raise (NotImplementedError(
                'Different coord systems are not yet ready to use'))

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()

        # and actually set the internal model in Lgm
        if self.attrs['internal_model'] == LGM_CDIP:
            Lgm_Set_Lgm_B_cdip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_EDIP:
            Lgm_Set_Lgm_B_edip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_IGRF:
            Lgm_Set_Lgm_B_IGRF_InternalModel(pointer(self._mmi))

        # either they are all one element or they are compatible lists no 1/2 way
        try:
            if len(self._Vpos) != len(self['Kp']) or \
                len(self._Vpos) != len(self['Epoch']) or \
                len(self['Epoch']) != len(self['Kp']):
                raise (ValueError(
                    'Inputs must be the same length, scalars or lists'))
        except TypeError:
            if isinstance(self._Vpos, list) and not isinstance(self['Kp'], list) \
                and not isinstance(self['Epoch'], list):
                raise (ValueError(
                    'Inputs must be the same length, scalars or lists'))

        #self.data = T89_Data(pos, time, Kp, coord_system, INTERNAL_MODEL)
        self['B'] = self.calc_B()
Пример #7
0
    def __init__(self, pos, time, direction='NORTH', coord_system = 'GSM', INTERNAL_MODEL='LGM_IGRF', EXTERNAL_MODEL='LGM_EXTMODEL_T89', MAGMODEL_ARGS=None, TargetHeight=120, tol=1e-7):
        super(Lgm_TraceToEarth_py, self).__init__(Position=pos, Epoch=time, direction=direction, coord_system = coord_system, INTERNAL_MODEL=INTERNAL_MODEL, EXTERNAL_MODEL=EXTERNAL_MODEL,
                                               TargetHeight=TargetHeight,
                                               tol=tol)
        if not isinstance(pos, Lgm_Vector.Lgm_Vector) and \
            not isinstance(pos, list):
            raise(TypeError('pos must be a Lgm_Vector or list') )
        self._Vpos = pos2Lgm_Vector(pos)
        # time must be a datetime
        if not isinstance(time, datetime.datetime) and \
            not isinstance(time, list):
            raise(TypeError('time must be a datetime or list of datetime') )

        if direction[0].upper() == 'N':
            direction=1.0
        elif direction[0].upper() == 'S':
            direction=-1.0
        else:
            raise(ValueError("Did not understand direction, must be N or S"))

                    
        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF'):
            raise(ValueError('INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, or LGM_IGRF') )
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        if coord_system != 'GSM':
            raise(NotImplementedError('Different coord systems are not yet ready to use') )

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()
        
        # and actually set the internal model in Lgm
        if self.attrs['internal_model'] == LGM_CDIP:
            Lgm_Set_Lgm_B_cdip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_EDIP:
            Lgm_Set_Lgm_B_edip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_IGRF:
            Lgm_Set_Lgm_B_IGRF_InternalModel(pointer(self._mmi))

        # set the external field model
        if EXTERNAL_MODEL not in (LGM_EXTMODEL_NULL,
                                  LGM_EXTMODEL_T87,
                                  LGM_EXTMODEL_T89,
                                  LGM_EXTMODEL_T89c,
                                  LGM_EXTMODEL_T96,
                                  LGM_EXTMODEL_T01S,
                                  LGM_EXTMODEL_T02,
                                  LGM_EXTMODEL_TS04,
                                  LGM_EXTMODEL_TS07,
                                  LGM_EXTMODEL_OP77) and \
          EXTERNAL_MODEL not in ('LGM_EXTMODEL_NULL',
                                  'LGM_EXTMODEL_T87',
                                  'LGM_EXTMODEL_T89',
                                  'LGM_EXTMODEL_T89c',
                                  'LGM_EXTMODEL_T96',
                                  'LGM_EXTMODEL_T01S',
                                  'LGM_EXTMODEL_T02',
                                  'LGM_EXTMODEL_TS04',
                                  'LGM_EXTMODEL_TS07',
                                  'LGM_EXTMODEL_OP77'):
            raise(ValueError('INTERNAL_MODEL must be {0}'.format('LGM_EXTMODEL_NULL',
                                  'LGM_EXTMODEL_T87',
                                  'LGM_EXTMODEL_T89',
                                  'LGM_EXTMODEL_T89c',
                                  'LGM_EXTMODEL_T96',
                                  'LGM_EXTMODEL_T01S',
                                  'LGM_EXTMODEL_T02',
                                  'LGM_EXTMODEL_TS04',
                                  'LGM_EXTMODEL_TS07',
                                  'LGM_EXTMODEL_OP77')) )
        if isinstance(EXTERNAL_MODEL, str):
            EXTERNAL_MODEL = eval(EXTERNAL_MODEL)
        self.attrs['external_model'] = EXTERNAL_MODEL
          
        # and actually set the internal model in Lgm
        if self.attrs['external_model'] == LGM_EXTMODEL_T89:
            Lgm_Set_Lgm_B_T89(pointer(self._mmi))
            self._mmi.Kp = MAGMODEL_ARGS['Kp']
        elif self.attrs['external_model'] == LGM_EXTMODEL_OP77:
            Lgm_Set_Lgm_B_OP77(pointer(self._mmi))
        else:
            raise(NotImplementedError("The external model has not yet been implemented: {0}".format(self.attrs['external_model'])))

                        
        # either they are all one element or they are compatible lists no 1/2 way
        try:
            if len(self._Vpos) != len(self['Kp']) or \
                len(self._Vpos) != len(self['Epoch']) or \
                len(self['Epoch']) != len(self['Kp']):
                raise(ValueError('Inputs must be the same length, scalars or lists'))
        except TypeError:
            if isinstance(self._Vpos, list) and not isinstance(self['Kp'], list) \
                and not isinstance(self['Epoch'], list):
                    raise(ValueError('Inputs must be the same length, scalars or lists'))

        date = Lgm_CTrans.dateToDateLong(self['Epoch'])
        utc = Lgm_CTrans.dateToFPHours(self['Epoch'])
        Lgm_Set_Coord_Transforms( date, utc, self._mmi.c) # dont need pointer as it is one

                    
        ans = Lgm_Vector.Lgm_Vector(-1, -1, -1)

        retval = Lgm_TraceToEarth(pointer(self._Vpos),
                                ctypes.pointer(ans),
                                ctypes.c_double(TargetHeight),
                                ctypes.c_double(direction),
                                ctypes.c_double(tol),
                                pointer(self._mmi) )

        if retval == LGM_CLOSED:
            self['footpoint'] = ans
            self.attrs['retcode'] = retval
        elif retval == LGM_OPEN_IMF:
            self['footpoint'] = np.nan
            warnings.warn("LGM_OPEN_IMF")
            self.attrs['retcode'] = retval
        elif retval == LGM_OPEN_N_LOBE:
            self['footpoint'] = np.nan
            warnings.warn("LGM_OPEN_N_LOBE")
            self.attrs['retcode'] = retval
        elif retval == LGM_OPEN_S_LOBE:
            self['footpoint'] = np.nan
            warnings.warn("LGM_OPEN_S_LOBE")
            self.attrs['retcode'] = retval
        elif retval == LGM_INSIDE_EARTH:
            self['footpoint'] = np.nan
            warnings.warn("LGM_INSIDE_EARTH")
            self.attrs['retcode'] = retval
        elif retval == LGM_TARGET_HEIGHT_UNREACHABLE:
            self['footpoint'] = np.nan
            warnings.warn("LGM_TARGET_HEIGHT_UNREACHABLE")
            self.attrs['retcode'] = retval
        elif retval == LGM_BAD_TRACE:
            self['footpoint'] = np.nan
            warnings.warn("LGM_BAD_TRACE")
            self.attrs['retcode'] = retval
Пример #8
0
    def __init__(self,
                 pos,
                 time,
                 direction='NORTH',
                 coord_system='GSM',
                 INTERNAL_MODEL='LGM_IGRF',
                 EXTERNAL_MODEL='LGM_EXTMODEL_T89',
                 MAGMODEL_ARGS=None,
                 TargetHeight=120,
                 tol=1e-7):
        super(Lgm_TraceToEarth_py,
              self).__init__(Position=pos,
                             Epoch=time,
                             direction=direction,
                             coord_system=coord_system,
                             INTERNAL_MODEL=INTERNAL_MODEL,
                             EXTERNAL_MODEL=EXTERNAL_MODEL,
                             TargetHeight=TargetHeight,
                             tol=tol)
        if not isinstance(pos, Lgm_Vector.Lgm_Vector) and \
            not isinstance(pos, list):
            raise (TypeError('pos must be a Lgm_Vector or list'))
        self._Vpos = pos2Lgm_Vector(pos)
        # time must be a datetime
        if not isinstance(time, datetime.datetime) and \
            not isinstance(time, list):
            raise (TypeError('time must be a datetime or list of datetime'))

        if direction[0].upper() == 'N':
            direction = 1.0
        elif direction[0].upper() == 'S':
            direction = -1.0
        else:
            raise (ValueError("Did not understand direction, must be N or S"))


        if INTERNAL_MODEL not in (LGM_CDIP,
                                  LGM_EDIP,
                                  LGM_IGRF) and \
            INTERNAL_MODEL not in ('LGM_CDIP',
                                  'LGM_EDIP',
                                  'LGM_IGRF'):
            raise (ValueError(
                'INTERNAL_MODEL must be LGM_CDIP, LGM_EDIP, or LGM_IGRF'))
        if isinstance(INTERNAL_MODEL, str):
            INTERNAL_MODEL = eval(INTERNAL_MODEL)
        self.attrs['internal_model'] = INTERNAL_MODEL

        if coord_system != 'GSM':
            raise (NotImplementedError(
                'Different coord systems are not yet ready to use'))

        self._mmi = Lgm_MagModelInfo.Lgm_MagModelInfo()

        # and actually set the internal model in Lgm
        if self.attrs['internal_model'] == LGM_CDIP:
            Lgm_Set_Lgm_B_cdip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_EDIP:
            Lgm_Set_Lgm_B_edip_InternalModel(pointer(self._mmi))
        elif self.attrs['internal_model'] == LGM_IGRF:
            Lgm_Set_Lgm_B_IGRF_InternalModel(pointer(self._mmi))

        # set the external field model
        if EXTERNAL_MODEL not in (LGM_EXTMODEL_NULL,
                                  LGM_EXTMODEL_T87,
                                  LGM_EXTMODEL_T89,
                                  LGM_EXTMODEL_T89c,
                                  LGM_EXTMODEL_T96,
                                  LGM_EXTMODEL_T01S,
                                  LGM_EXTMODEL_T02,
                                  LGM_EXTMODEL_TS04,
                                  LGM_EXTMODEL_TS07,
                                  LGM_EXTMODEL_OP77) and \
          EXTERNAL_MODEL not in ('LGM_EXTMODEL_NULL',
                                  'LGM_EXTMODEL_T87',
                                  'LGM_EXTMODEL_T89',
                                  'LGM_EXTMODEL_T89c',
                                  'LGM_EXTMODEL_T96',
                                  'LGM_EXTMODEL_T01S',
                                  'LGM_EXTMODEL_T02',
                                  'LGM_EXTMODEL_TS04',
                                  'LGM_EXTMODEL_TS07',
                                  'LGM_EXTMODEL_OP77'):
            raise (ValueError('INTERNAL_MODEL must be {0}'.format(
                'LGM_EXTMODEL_NULL', 'LGM_EXTMODEL_T87', 'LGM_EXTMODEL_T89',
                'LGM_EXTMODEL_T89c', 'LGM_EXTMODEL_T96', 'LGM_EXTMODEL_T01S',
                'LGM_EXTMODEL_T02', 'LGM_EXTMODEL_TS04', 'LGM_EXTMODEL_TS07',
                'LGM_EXTMODEL_OP77')))
        if isinstance(EXTERNAL_MODEL, str):
            EXTERNAL_MODEL = eval(EXTERNAL_MODEL)
        self.attrs['external_model'] = EXTERNAL_MODEL

        # and actually set the internal model in Lgm
        if self.attrs['external_model'] == LGM_EXTMODEL_T89:
            Lgm_Set_Lgm_B_T89(pointer(self._mmi))
            self._mmi.Kp = MAGMODEL_ARGS['Kp']
        elif self.attrs['external_model'] == LGM_EXTMODEL_OP77:
            Lgm_Set_Lgm_B_OP77(pointer(self._mmi))
        else:
            raise (NotImplementedError(
                "The external model has not yet been implemented: {0}".format(
                    self.attrs['external_model'])))

        # either they are all one element or they are compatible lists no 1/2 way
        try:
            if len(self._Vpos) != len(self['Kp']) or \
                len(self._Vpos) != len(self['Epoch']) or \
                len(self['Epoch']) != len(self['Kp']):
                raise (ValueError(
                    'Inputs must be the same length, scalars or lists'))
        except TypeError:
            if isinstance(self._Vpos, list) and not isinstance(self['Kp'], list) \
                and not isinstance(self['Epoch'], list):
                raise (ValueError(
                    'Inputs must be the same length, scalars or lists'))

        date = Lgm_CTrans.dateToDateLong(self['Epoch'])
        utc = Lgm_CTrans.dateToFPHours(self['Epoch'])
        Lgm_Set_Coord_Transforms(date, utc,
                                 self._mmi.c)  # dont need pointer as it is one

        ans = Lgm_Vector.Lgm_Vector(-1, -1, -1)

        retval = Lgm_TraceToEarth(pointer(self._Vpos), ctypes.pointer(ans),
                                  ctypes.c_double(TargetHeight),
                                  ctypes.c_double(direction),
                                  ctypes.c_double(tol), pointer(self._mmi))

        if retval == LGM_CLOSED:
            self['footpoint'] = ans
            self.attrs['retcode'] = retval
        elif retval == LGM_OPEN_IMF:
            self['footpoint'] = np.nan
            warnings.warn("LGM_OPEN_IMF")
            self.attrs['retcode'] = retval
        elif retval == LGM_OPEN_N_LOBE:
            self['footpoint'] = np.nan
            warnings.warn("LGM_OPEN_N_LOBE")
            self.attrs['retcode'] = retval
        elif retval == LGM_OPEN_S_LOBE:
            self['footpoint'] = np.nan
            warnings.warn("LGM_OPEN_S_LOBE")
            self.attrs['retcode'] = retval
        elif retval == LGM_INSIDE_EARTH:
            self['footpoint'] = np.nan
            warnings.warn("LGM_INSIDE_EARTH")
            self.attrs['retcode'] = retval
        elif retval == LGM_TARGET_HEIGHT_UNREACHABLE:
            self['footpoint'] = np.nan
            warnings.warn("LGM_TARGET_HEIGHT_UNREACHABLE")
            self.attrs['retcode'] = retval
        elif retval == LGM_BAD_TRACE:
            self['footpoint'] = np.nan
            warnings.warn("LGM_BAD_TRACE")
            self.attrs['retcode'] = retval