@@ 363-404 (lines=42) @@ | ||
360 | # if array is returned, dtype is object, so convert to float |
|
361 | return np.float64(glat), np.float64(glon), np.float64(error) |
|
362 | ||
363 | def _apex2qd_nonvectorized(self, alat, alon, height): |
|
364 | """Convert from apex to quasi-dipole (not-vectorised) |
|
365 | ||
366 | Parameters |
|
367 | ----------- |
|
368 | alat : (float) |
|
369 | Apex latitude in degrees |
|
370 | alon : (float) |
|
371 | Apex longitude in degrees |
|
372 | height : (float) |
|
373 | Height in km |
|
374 | ||
375 | Returns |
|
376 | --------- |
|
377 | qlat : (float) |
|
378 | Quasi-dipole latitude in degrees |
|
379 | qlon : (float) |
|
380 | Quasi-diplole longitude in degrees |
|
381 | """ |
|
382 | ||
383 | alat = helpers.checklat(alat, name='alat') |
|
384 | ||
385 | # convert modified apex to quasi-dipole: |
|
386 | qlon = alon |
|
387 | ||
388 | # apex height |
|
389 | hA = self.get_apex(alat) |
|
390 | ||
391 | if hA < height: |
|
392 | if np.isclose(hA, height, rtol=0, atol=1e-5): |
|
393 | # allow for values that are close |
|
394 | hA = height |
|
395 | else: |
|
396 | estr = 'height {:.3g} is > apex height'.format(np.max(height))\ |
|
397 | + ' {:.3g} for alat {:.3g}'.format(hA, alat) |
|
398 | raise ApexHeightError(estr) |
|
399 | ||
400 | salat = np.sign(alat) if alat != 0 else 1 |
|
401 | qlat = salat * np.degrees(np.arccos(np.sqrt((self.RE + height) / |
|
402 | (self.RE + hA)))) |
|
403 | ||
404 | return qlat, qlon |
|
405 | ||
406 | def apex2qd(self, alat, alon, height): |
|
407 | """Converts modified apex to quasi-dipole coordinates. |
|
@@ 437-457 (lines=21) @@ | ||
434 | # if array is returned, the dtype is object, so convert to float |
|
435 | return np.float64(qlat), np.float64(qlon) |
|
436 | ||
437 | def _qd2apex_nonvectorized(self, qlat, qlon, height): |
|
438 | ||
439 | qlat = helpers.checklat(qlat, name='qlat') |
|
440 | ||
441 | alon = qlon |
|
442 | hA = self.get_apex(qlat, height) # apex height |
|
443 | ||
444 | if hA < self.refh: |
|
445 | if np.isclose(hA, self.refh, rtol=0, atol=1e-5): |
|
446 | # allow for values that are close |
|
447 | hA = self.refh |
|
448 | else: |
|
449 | estr = 'apex height ({:.3g}) is < reference height '.format(hA) |
|
450 | estr += '({:.3g}) for qlat {:.3g}'.format(self.refh, qlat) |
|
451 | raise ApexHeightError(estr) |
|
452 | ||
453 | sqlat = np.sign(qlat) if qlat != 0 else 1 |
|
454 | alat = sqlat * np.degrees(np.arccos(np.sqrt((self.RE + self.refh) / |
|
455 | (self.RE + hA)))) |
|
456 | ||
457 | return alat, alon |
|
458 | ||
459 | def qd2apex(self, qlat, qlon, height): |
|
460 | """Converts quasi-dipole to modified apex coordinates. |