Example usage for org.apache.commons.math.complex Complex add

List of usage examples for org.apache.commons.math.complex Complex add

Introduction

In this page you can find the example usage for org.apache.commons.math.complex Complex add.

Prototype

public Complex add(Complex rhs) 

Source Link

Document

Return the sum of this complex number and the given complex number.

Usage

From source file:com.discursive.jccook.math.ComplexNumbers.java

public static void main(String[] args) {
    Complex a = new Complex(2, 3);
    Complex b = new Complex(4, 5);
    Complex c = new Complex(0.3, 2);
    Complex e = new Complex(4, 4);

    Complex sum = a.add(b);
    Complex d = c.divide(sum);/*from   w  w w . ja  v  a 2s. co  m*/
    Complex f = e.multiply(d.conjugate());

    System.out.println("D is: " + ComplexFormat.formatComplex(d));
    System.out.println("F is: " + ComplexFormat.formatComplex(f));

    double realF = f.getReal();
    double imD = d.getImaginary();
    double answer = realF / imD;

    System.out.println("Answer: " + NumberFormat.getInstance().format(answer));

}

From source file:org.asterope.ephem.moons.Mars07.java

/**
 * This method delivers the ephemerides of the Martian moons.
 * It is based on a numerical model fitted to observations dispatched
 * from 1877 to 2005. The expected accuracy of these ephemerides 
 * is around 500 meters for the period [1998:2010], and few kilometers 
 * for the period [1967:2020].<P>//from w w w  . j ava 2 s  .  c  o m
 * There are no explicit time limit in the use of this subroutine.
 * However we DO NOT recommend its use outside the period [1877-2025].
 * More details are available in (Lainey, Dehant, Patzold, 2007).
 * 
 * @param ET Ephemeris time, TDB.
 * @param nsat Satellite ID constant. Constants defined in this class.
 * @param outputType Select the output type. Constants defined in this class.
 * @return The output elements/positions. Angles in radians, positions in AU 
 * (mean equatorial J2000).
 */
public static double[] getMoonPosition(double ET, int nsat, int outputType) {
    double gk2 = Math.pow(EphemConstant.EARTH_MEAN_ORBIT_RATE, 2), enrad = 0.017453292519943;
    double ELEM[] = new double[6];
    double L[] = new double[] { 19.7020556283139, 4.9770138896523 };
    double XV[] = new double[6];
    double MU[] = new double[] { 3.2271557149889E-07, 3.2271556750209E-07 };

    double ACC[] = new double[] { 1.657852042683113e-10, -2.331793571572226e-14 };
    int nf1[] = new int[] { 33, 57, 28, 29 };
    int nf2[] = new int[] { 50, 30, 17, 28 };
    int nf[] = new int[4];

    double EL1Aa[] = new double[] { 0.00006269161880, 0.00000000226877, 0.00000000226877, 0.00000000036560,
            0.00000000036560, 0.00000000038928, 0.00000000038928, 0.00000000017647, 0.00000000017647,
            0.00000000010473, 0.00000000010473, 0.00000000004570, 0.00000000004570, 0.00000000003102,
            0.00000000003102, 0.00000000002648, 0.00000000002648, 0.00000000000906, 0.00000000000906,
            0.00000000000782, 0.00000000000782, 0.00000000000768, 0.00000000000768, 0.00000000000652,
            0.00000000000652, 0.00000000000831, 0.00000000000831, 0.00000000000664, 0.00000000000664,
            0.00000000000428, 0.00000000000428, 0.00000000000362, 0.00000000000362 };
    double EL1La[] = new double[] { 2.09129739264173, 0.00005016848130, 0.00005016848130, 0.00003350264970,
            0.00003350264903, 0.00002827839093, 0.00002827839093, 0.00001578862428, 0.00001578862427,
            0.00001504422160, 0.00001504422160, 0.00000817856317, 0.00000817856334, 0.00001022163922,
            0.00001022163922, 0.00000651695172, 0.00000651695172, 0.00000506658494, 0.00000506658494,
            0.00000374173438, 0.00000374173438, 0.00000258935939, 0.00000258935939, 0.00000112514742,
            0.00000112514742, 0.00000076176630, 0.00000076176630, 0.00000049765123, 0.00000049765123,
            0.00000068419668, 0.00000068419668, 0.00000056243429, 0.00000056243429, 0.00000039367057,
            0.00000039367057, 0.00000052032286, 0.00000052032286, 0.00000035833947, 0.00000035833947,
            0.00000030110114, 0.00000030110114, 0.00000019649769, 0.00000019649645, 0.00000024936539,
            0.00000024936539, 0.00000024024140, 0.00000024024140, 0.00000017471331, 0.00000017471331,
            0.00000017930767, 0.00000017930768, 0.00000013268776, 0.00000013268776, 0.00000012696364,
            0.00000012696364, 0.00000012547154, 0.00000012547155 };
    double EL1Za[] = new double[] { 0.01514110912521, 0.00038496208674, 0.00006903413242, 0.00004946101994,
            0.00003671320788, 0.00003267983782, 0.00000875048305, 0.00000617093881, 0.00000695700594,
            0.00000573408896, 0.00000343157786, 0.00000403740951, 0.00000211529622, 0.00000190482762,
            0.00000084613232, 0.00000086960947, 0.00000063298682, 0.00000061303178, 0.00000057372171,
            0.00000081810883, 0.00000074341453, 0.00000054416478, 0.00000050445150, 0.00000042845991,
            0.00000042249373, 0.00000035819498, 0.00000038088812, 0.00000040557392 };
    double EL1ZETAa[] = new double[] { 0.00940860518312, 0.00007892894454, 0.00005699538102, 0.00002474369483,
            0.00002062715397, 0.00000594557416, 0.00000392019020, 0.00000216779197, 0.00000276976375,
            0.00000181353917, 0.00000108342918, 0.00000106665701, 0.00000079098533, 0.00000088808851,
            0.00000055207589, 0.00000043978860, 0.00000045836091, 0.00000035331311, 0.00000035029885,
            0.00000038288517, 0.00000027112473, 0.00000019917454, 0.00000020368977, 0.00000017267796,
            0.00000015744728, 0.00000016985677, 0.00000010150045, 0.00000008259149, 0.00000008504923 };
    double EL1Ap[] = new double[] { 0.00000000, -0.23137652, 0.23137652, 0.31903311, -0.31903311, -0.15425102,
            0.15425102, 0.46275305, -0.46275305, -0.13411243, 0.13411243, 0.11568826, -0.11568826, -0.84211324,
            0.84211324, 0.10397809, -0.10397809, 0.15952911, -0.15952911, 0.10875357, -0.10875357, 0.29864398,
            -0.29864398, -0.18884134, 0.18884134, 0.15951656, -0.15951656, 0.84383237, -0.84383237, -0.15939353,
            0.15939353, -0.10628011, 0.10628011 };
    double EL1Lp[] = new double[] { 0.00000000, 686.99369592, -686.99369241, -4077.46840757, 4077.46821917,
            -343.48537930, 343.48537949, 826.22438660, -826.22438999, 0.23137650, -0.23137650, 2026.08615872,
            -2026.08614258, -0.31903309, 0.31903309, 228.99331848, -228.99331849, 0.46275300, -0.46275300,
            0.15425100, -0.15425100, -242.61956612, 242.61956592, -171.74597329, 171.74597310, 0.13411241,
            -0.13411241, -375.12500185, 375.12500278, -413.26245099, 413.26245103, 179.29817450, -179.29817450,
            -1.02723078, 1.02723078, -0.11568825, 0.11568825, 0.84211307, -0.84211307, -4.78104120, 4.78104120,
            -8341.85985545, 8341.72443362, 0.15952910, -0.15952910, -0.10397808, 0.10397808, -137.39750245,
            137.39750251, 1035.39217901, -1035.39219300, 0.15951654, -0.15951654, -0.18884132, 0.18884132,
            -513.09805470, 513.09805450 };
    double EL1Zp[] = new double[] { 827.21507332, 0.31891012, 587.39458533, -826.16172371, 0.13409069,
            -0.84297139, 0.15948580, 1.02595676, 0.10396503, 316.64130873, 0.18879824, -0.29875184,
            4054.54269012, -0.10629376, 0.00000000, -0.12164857, 686.47877752, 375.32150909, -4052.07162766,
            0.23131182, 216.74351242, -0.23144126, -0.13798985, -0.31920648, -0.18154621, 242.67861994,
            1035.98671884, 2043.26880788 };
    double EL1ZETAp[] = new double[] { -826.20642714, 0.00000000, -686.99749665, 343.48630483, 827.20268346,
            228.99362064, 687.00755782, -343.48244903, -0.84297139, 0.15942429, 0.31891012, 171.74558971,
            242.62779510, -4.75353965, 1.02595676, 0.13409069, -228.99359936, -374.99999997, 4073.32789493,
            0.51266007, 587.77857598, -242.62375723, 179.29612278, 0.23144134, -0.29875184, 137.41607584,
            0.18879824, -0.31890996, -1028.57142835 };
    double EL1Af[] = new double[] { 0.000000000000, 1.269694941721, -1.269694972385, 0.683991069326,
            -0.683991048830, 1.769154106463, -1.769154016711, -0.751833721919, 0.751833534661, 0.582878090440,
            -0.582877938274, -2.055123065092, 2.055123107938, -1.167907572776, 1.167907593259, -1.085910468998,
            1.085910738159, -1.123139908698, 1.123139843925, 2.223276867087, -2.223277592714, 0.692161581064,
            -0.692161667059, 0.067382573233, -0.067382536015, 1.368231513583, -1.368231474439, 0.260153915930,
            -0.260153924005, -0.059038385412, 0.059038528330, 0.103874462974, -0.103874462966 };
    double EL1Lf[] = new double[] { -0.000000000014, -0.949015738908, 0.949016158884, -0.380534526596,
            0.380533948496, 0.994821588644, -0.994821497820, -2.870499589128, 2.870499308383, -2.834185436330,
            2.834185466290, 0.919444544403, -0.919444319278, 0.895559796633, -0.895559859111, 2.848996739890,
            -2.848996748767, -2.328774139340, 2.328774139340, 2.912659020395, -2.912659547077, 2.215327142355,
            -2.215327333708, -0.377627161385, 0.377626798556, -2.161248941800, 2.161248590720, -1.231836210236,
            1.231836585135, -2.488083095032, 2.488083105051, 1.576141879515, -1.576141881804, 0.137856626591,
            -0.137856591483, -2.626756099135, 2.626756111094, 2.759579592331, -2.759579510413, 0.277512180092,
            -0.277511887506, -0.093530900566, 0.093432654525, 0.430292851332, -0.430292825369, 2.695745393985,
            -2.695745301579, 2.099637656810, -2.099637491253, -0.693740926999, 0.693740188061, -0.220489234489,
            0.220488707822, 1.654303228826, -1.654303208682, 1.546722735399, -1.546722718402 };
    double EL1Zf[] = new double[] { 1.404382124885, 2.088385523034, -2.387807946031, 0.498957209475,
            0.821521022172, -2.905108919700, 2.772375719698, 2.839303414769, 0.318450317043, 1.410329121503,
            1.336796551701, -2.429538561192, 0.254706736621, 1.508224230072, 2.321836603108, 0.034626075514,
            -3.084529992972, -1.119230636263, 0.780393743699, -3.018597072641, -1.071855877472, 2.691716763490,
            1.001733960626, -3.071035704337, -2.137527057619, -1.219306169725, 2.558639707373,
            -0.990686281624 };
    double EL1ZETAf[] = new double[] { 2.058107128488, -2.386965958787, -3.034328817803, -1.725904319907,
            -0.169761953966, 2.067112903892, 1.700689207004, -2.706125953253, -1.342900415409, 2.117885747855,
            0.517605536523, -0.418936524968, -3.042493138839, 0.757075199434, 0.660891079606, -0.763516173091,
            -0.439185212306, -1.680429911951, 2.685649467156, -2.930008429370, 2.556761413073, -1.660815588764,
            0.749769089433, -2.317979704428, -1.539326818938, -2.877315237045, 0.374238084921, 1.374678754422,
            1.140160118874 };

    double EL2Aa[] = new double[] { 0.00015681340867, 0.00000000269918, 0.00000000269918, 0.00000000035476,
            0.00000000035476, 0.00000000018689, 0.00000000018689, 0.00000000011687, 0.00000000011687,
            0.00000000008485, 0.00000000008485, 0.00000000002657, 0.00000000002657, 0.00000000003523,
            0.00000000003523, 0.00000000002117, 0.00000000002117, 0.00000000001407, 0.00000000001407,
            0.00000000001275, 0.00000000001275, 0.00000000000838, 0.00000000000838, 0.00000000000486,
            0.00000000000486, 0.00000000000476, 0.00000000000476, 0.00000000000487, 0.00000000000487,
            0.00000000000514, 0.00000000000514, 0.00000000000334, 0.00000000000334, 0.00000000000344,
            0.00000000000344, 0.00000000000310, 0.00000000000310, 0.00000000000268, 0.00000000000268,
            0.00000000000168, 0.00000000000168, 0.00000000000146, 0.00000000000146, 0.00000000000149,
            0.00000000000149, 0.00000000000132, 0.00000000000132, 0.00000000000102, 0.00000000000102,
            0.00000000000109 };
    double EL2La[] = new double[] { 1.91675212352556, 0.00248303166019, 0.00248303165949, 0.00020234269782,
            0.00020234269782, 0.00010431675642, 0.00010431675643, 0.00008185668873, 0.00008185668873,
            0.00002410335710, 0.00002410335710, 0.00001497066023, 0.00001497066034, 0.00000568514429,
            0.00000568514429, 0.00000417530493, 0.00000417530493, 0.00000438325450, 0.00000438325450,
            0.00000415808821, 0.00000415808821, 0.00000322379379, 0.00000322379379, 0.00000396334370,
            0.00000396334370, 0.00000390506421, 0.00000311780183, 0.00000390506421, 0.00000311780183,
            0.00000165754846 };
    double EL2Za[] = new double[] { 0.00027441315346, 0.00006015912711, 0.00003534984782, 0.00003614585349,
            0.00002577157903, 0.00000680199783, 0.00000445297914, 0.00000223848292, 0.00000092341709,
            0.00000147874757, 0.00000145772004, 0.00000134703031, 0.00000075381791, 0.00000087162297,
            0.00000101564888, 0.00000050909893, 0.00000065370775 };
    double EL2ZETAa[] = new double[] { 0.01562693319959, 0.00775101287565, 0.00013218186311, 0.00003833652719,
            0.00002660211842, 0.00002882438535, 0.00002713213911, 0.00000929632495, 0.00000446096029,
            0.00000490415603, 0.00000236688115, 0.00000205755285, 0.00000236575014, 0.00000122881444,
            0.00000121518946, 0.00000096028570, 0.00000117447177, 0.00000105844105, 0.00000238314749,
            0.00000076563038, 0.00000040758243, 0.00000049623409, 0.00000030030779, 0.00000026134164,
            0.00000028919452, 0.00000022137882, 0.00000024499503, 0.00000016524166 };
    double EL2Ap[] = new double[] { 0.00000000, 2.73847176, -2.73847176, 0.63238251, -0.63238251, 1.82564784,
            -1.82564784, -0.63296515, 0.63296515, 5.47694352, -5.47694352, 0.63354887, -0.63354887, 0.63122038,
            -0.63122038, 0.63180092, -0.63180092, 2.73884829, -2.73884829, -2.73809533, 2.73809533, 1.36923588,
            -1.36923588, -0.63118038, 0.63118038, 0.63064094, -0.63064094, -0.42669999, 0.42669999, 0.63413367,
            -0.63413367, 2.34192368, -2.34192368, 2.34247408, -2.34247408, 0.63236243, -0.63236243, -1.26252066,
            1.26252066, 0.63240258, -0.63240258, -1.82581518, 1.82581518, 2.34219905, -2.34219905, -1.82548053,
            1.82548053, 0.63294504, -0.63294504, 2.72759910 };
    double EL2Lp[] = new double[] { 0.00000000, -19925.25479395, 19925.25482649, -686.99361389, 686.99361415,
            -343.48525280, 343.48525251, 2.73847175, -2.73847175, -228.99419233, 228.99419233, -337.66341441,
            337.66341418, 5.47694261, -5.47694261, 1.82564754, -1.82564754, 10149.06972719, -10149.06971679,
            171.76869151, -171.76869151, 226.39849071, -226.39849071, -0.63238250, 0.63238250, -711.69825336,
            -663.85314762, 711.69825335, 663.85314763, 0.00000000 };
    double EL2Zp[] = new double[] { 19956.74479178, 1.26244078, 0.00000000, -19926.60456897, 2.34219912,
            -1.26709782, 4.09222912, -1.26943918, 0.00000000, 26995.13970336, 16059.93520224, 0.86409248,
            0.42132977, 349.50296239, 16.18594275, -1.27178920, -1.26244078 };
    double EL2ZETAp[] = new double[] { -19916.19973129, 0.00000000, 343.48730623, -686.99215577, 687.01233091,
            228.99391436, 19892.53158003, 337.66474671, -343.48211159, 171.74656701, -664.09364734,
            226.39163557, 711.55812043, -337.66025169, 349.52237555, -10037.28889631, -228.99413227,
            664.12627842, 37351.49200304, 137.38646249, 170.59316073, 0.63120042, -226.50126587, -705.59895012,
            231.14050852, -171.66458272, 0.63238270, 692.28265851 };
    double EL2Af[] = new double[] { 0.000000000000, -0.136381775523, 0.136381777698, -2.850380153005,
            2.850380089315, -1.926604205693, 1.926604195461, 0.367583823079, -0.367583824486, 1.615243161942,
            -1.615243160951, 2.114704903813, -2.114704908419, 0.939338838730, -0.939338816854, -2.333690484620,
            2.333690544274, 2.089322500989, -2.089322282950, -0.779557024035, 0.779557327338, 2.361851648242,
            -2.361851691087, -2.770026814512, 2.770026952645, -1.549662975963, 1.549663021137, 3.024403974280,
            -3.024403881041, -1.686885659588, 1.686885282544, 3.057688429345, -3.057688457348, -0.829253165285,
            0.829253093148, -1.954686031809, 1.954686103625, -2.168321203999, 2.168321557125, 2.516818643150,
            -2.516818534200, -0.299782666734, 0.299782747411, 2.143143410577, -2.143143430348, 1.011403786810,
            -1.011403745572, 0.538228537741, -0.538228903445, -2.653997343428 };
    double EL2Lf[] = new double[] { -3.141592653540, -2.488175621789, 2.488175634463, 0.946296042215,
            -0.946295960274, 1.001646985816, -1.001647348657, 1.433490072350, -1.433489965321, -2.852007788402,
            2.852007788273, 3.136008703144, -3.136009000145, -3.100668654449, 3.100668633924, -0.366003419529,
            0.366003444013, -2.738313647435, 2.738313658144, 0.461419338359, -0.461419338359, 0.675422268593,
            -0.675422268593, 1.281544455534, -1.281544458794, 1.797966683376, -0.222101391798, -1.797966684284,
            0.222101394466, -3.141592653523 };
    double EL2Zf[] = new double[] { 2.198649419514, -1.916548788202, 2.345230773944, 1.463816210370,
            1.362467588064, 0.933679289332, -3.130753296830, -1.549133813261, 0.599042274749, -0.546542453837,
            -1.198239348674, -2.050414656408, 1.516439412109, 3.100618466711, -1.127752616215, 2.250768124831,
            -2.860933968311 };
    double EL2ZETAf[] = new double[] { 2.981506933511, -2.386504179132, -1.725684412813, -3.035061242067,
            1.701551338710, 2.067662003165, -1.477858084701, 2.318788380092, -2.669604598165, -0.415374756507,
            -0.786669759362, -0.162822349334, -2.670796098338, -0.729022305245, -2.721699324043, 1.941975361869,
            -0.437940530420, 1.821048365911, 0.758713545461, -2.990293668575, -2.517169198799, -0.535940350960,
            1.724062868741, -1.853437577537, 0.865916190901, 2.259603352363, 1.108725025984, 1.680391963791 };
    double ELA[][] = new double[57][3];
    double ELL[][] = new double[57][3];
    double ELZ[][] = new double[57][3];
    double ELZETA[][] = new double[57][3];

    Complex RESULT;

    double ome0 = 47.68143, ainc0 = 37.1135;
    double dome = -0.1061, dainc = 0.0609;

    ET = ET - EphemConstant.J2000;
    double DAT = ET;
    double DAT2 = ET + 6491.5; // retour a la date du 2445053.5 (25/03/1982, 0H00am)

    if (nsat == 0) {
        for (int i = 0; i < 4; i++) {
            nf[i] = nf1[i];
        }
        for (int i = 0; i < nf[0]; i++) {
            ELA[i][0] = EL1Aa[i];
            ELA[i][1] = EL1Ap[i];
            ELA[i][2] = EL1Af[i];
        }
        for (int i = 0; i < nf[1]; i++) {
            ELL[i][0] = EL1La[i];
            ELL[i][1] = EL1Lp[i];
            ELL[i][2] = EL1Lf[i];
        }
        for (int i = 0; i < nf[2]; i++) {
            ELZ[i][0] = EL1Za[i];
            ELZ[i][1] = EL1Zp[i];
            ELZ[i][2] = EL1Zf[i];
        }
        for (int i = 0; i < nf[3]; i++) {
            ELZETA[i][0] = EL1ZETAa[i];
            ELZETA[i][1] = EL1ZETAp[i];
            ELZETA[i][2] = EL1ZETAf[i];
        }
    } else {
        for (int i = 0; i < 4; i++) {
            nf[i] = nf2[i];
        }
        for (int i = 0; i < nf[0]; i++) {
            ELA[i][0] = EL2Aa[i];
            ELA[i][1] = EL2Ap[i];
            ELA[i][2] = EL2Af[i];
        }
        for (int i = 0; i < nf[1]; i++) {
            ELL[i][0] = EL2La[i];
            ELL[i][1] = EL2Lp[i];
            ELL[i][2] = EL2Lf[i];
        }
        for (int i = 0; i < nf[2]; i++) {
            ELZ[i][0] = EL2Za[i];
            ELZ[i][1] = EL2Zp[i];
            ELZ[i][2] = EL2Zf[i];
        }
        for (int i = 0; i < nf[3]; i++) {
            ELZETA[i][0] = EL2ZETAa[i];
            ELZETA[i][1] = EL2ZETAp[i];
            ELZETA[i][2] = EL2ZETAf[i];
        }
    }

    RESULT = new Complex(0.0, 0.0);
    for (int i = 0; i < nf[0]; i++) {
        if (ELA[i][1] == 0.) {
            RESULT = (((new Complex(0.0, ELA[i][2])).exp()).multiply(ELA[i][0])).add(RESULT);
        } else {
            RESULT = RESULT.add(((new Complex(0.0, (2. * Math.PI / ELA[i][1]) * DAT2 + ELA[i][2])).exp())
                    .multiply(ELA[i][0]));
        }
    }
    ELEM[0] = RESULT.getReal();

    RESULT = new Complex(0.0, 0.0);
    for (int i = 0; i < nf[1]; i++) {
        if (ELL[i][1] == 0.) {
            RESULT = (((new Complex(0.0, ELL[i][2])).exp()).multiply(ELL[i][0])).add(RESULT);
        } else {
            RESULT = RESULT.add(((new Complex(0.0, (2. * Math.PI / ELL[i][1]) * DAT2 + ELL[i][2])).exp())
                    .multiply(ELL[i][0]));
        }
    }
    ELEM[1] = RESULT.getReal();

    RESULT = new Complex(0.0, 0.0);
    for (int i = 0; i < nf[2]; i++) {
        if (ELZ[i][1] == 0.) {
            RESULT = (((new Complex(0.0, ELZ[i][2])).exp()).multiply(ELZ[i][0])).add(RESULT);
        } else {
            RESULT = RESULT.add(((new Complex(0.0, (2. * Math.PI / ELZ[i][1]) * DAT2 + ELZ[i][2])).exp())
                    .multiply(ELZ[i][0]));
        }
    }
    ELEM[2] = RESULT.getReal();
    ELEM[3] = RESULT.getImaginary();

    RESULT = new Complex(0.0, 0.0);
    for (int i = 0; i < nf[3]; i++) {
        if (ELZETA[i][1] == 0.) {
            RESULT = (((new Complex(0.0, ELZETA[i][2])).exp()).multiply(ELZETA[i][0])).add(RESULT);
        } else {
            RESULT = RESULT.add(((new Complex(0.0, (2. * Math.PI / ELZETA[i][1]) * DAT2 + ELZETA[i][2])).exp())
                    .multiply(ELZETA[i][0]));
        }
    }
    ELEM[4] = RESULT.getReal();
    ELEM[5] = RESULT.getImaginary();

    ELEM[1] += L[nsat] * DAT2 + ACC[nsat] * DAT2 * DAT2;
    ELEM[1] = Math.atan2(Math.sin(ELEM[1]), Math.cos(ELEM[1]));
    if (ELEM[1] < 0.0)
        ELEM[1] += 2. * Math.PI;

    if (outputType == Mars07.OUTPUT_POSITIONS) {
        double xmu = MU[nsat] * gk2;
        double ome = (ome0 + dome * DAT / 36525.) * enrad;
        double ainc = (ainc0 + dainc * DAT / 36525.) * enrad;
        XV = Mars07.ELEM2PV(xmu, ELEM);
        ELEM[0] = XV[0] * Math.cos(ome) - XV[1] * Math.sin(ome) * Math.cos(ainc)
                + XV[2] * Math.sin(ainc) * Math.sin(ome);
        ELEM[1] = XV[0] * Math.sin(ome) + XV[1] * Math.cos(ome) * Math.cos(ainc)
                - XV[2] * Math.sin(ainc) * Math.cos(ome);
        ELEM[2] = XV[1] * Math.sin(ainc) + XV[2] * Math.cos(ainc);
        ELEM[3] = XV[3] * Math.cos(ome) - XV[4] * Math.sin(ome) * Math.cos(ainc)
                + XV[5] * Math.sin(ainc) * Math.sin(ome);
        ELEM[4] = XV[3] * Math.sin(ome) + XV[4] * Math.cos(ome) * Math.cos(ainc)
                - XV[5] * Math.sin(ainc) * Math.cos(ome);
        ELEM[5] = XV[4] * Math.sin(ainc) + XV[5] * Math.cos(ainc);
    }

    return ELEM;
}

From source file:org.eclipse.ice.reflectivity.ReflectivityCalculator.java

/**
 * This operation returns the value of the squared modulus of the specular
 * reflectivity for a single wave vector Q.
 *
 * @param waveVectorQ// w  w w  .jav  a  2  s.c o m
 *            the value of the wave vector
 * @param wavelength
 *            the wavelength of the incident neutrons
 * @param tiles
 *            the list of Tiles that contains the physical parameters needed
 *            for the calculation, including the scattering densities,
 *            absorption parameters and thicknesses.
 * @return the squared modulus of the specular reflectivity
 */
public double getModSqrdSpecRef(double waveVectorQ, double wavelength, Tile[] tiles) {

    double modSqrdSpecRef = 0.0;

    if (wavelength > 0.0) {
        // Variables only needed if we are going to do the work, i.e. -
        // wavelength > 0.0.
        Tile tile;
        Complex aNm1Sq, fNm1N, rNm1N = new Complex(0.0, 0.0), one = new Complex(1.0, 0.0),
                qN = new Complex(0.0, 0.0), rNNp1 = new Complex(0.0, 0.0);
        // Get the bottom tile
        int nLayers = tiles.length;
        tile = tiles[nLayers - 1];
        // Starting point--no reflected beam in bottom-most (bulk) layer
        double qCSq = 16.0 * Math.PI * tile.scatteringLength;
        double muLAbs = tile.trueAbsLength;
        double mulInc = tile.incAbsLength;
        double thickness = tile.thickness;
        // Setup other values for the problem
        double betaNm1 = 4.0 * Math.PI * (muLAbs + mulInc / wavelength);
        Complex qNm1 = new Complex(waveVectorQ * waveVectorQ - qCSq, -2.0 * betaNm1);
        qNm1 = qNm1.sqrt();
        // Loop through to calculate recursion formula described in Parratt.
        // Start at the bottom and work up.
        for (int i = nLayers - 1; i > 0; i--) {
            // Get the tile above tile[i] (started at the bottom
            tile = tiles[i - 1];
            // Calculate the normal component of Q for layer and layer-1
            qN = qNm1;
            qCSq = 16.0 * Math.PI * tile.scatteringLength;
            muLAbs = tile.trueAbsLength;
            mulInc = tile.incAbsLength;
            thickness = tile.thickness;
            betaNm1 = 4.0 * Math.PI * (muLAbs + mulInc / wavelength);
            qNm1 = new Complex(waveVectorQ * waveVectorQ - qCSq, -2.0 * betaNm1);
            qNm1 = qNm1.sqrt();
            // Calculate phase factor, e^(-0.5*d*qNm1)
            aNm1Sq = (new Complex(qNm1.getImaginary(), qNm1.getReal()).multiply(-0.5 * thickness)).exp();
            // CDiv(qNm1-qN,qNm1+qN)
            fNm1N = qNm1.subtract(qN).divide(qNm1.add(qN));
            // Calculate the reflectivity amplitude.
            // CMult(aNm1Sq, CMult(aNm1Sq, CDiv(CAdd(rNNp1, fNm1N),
            // CAdd(CMult(rNNp1, fNm1N), CReal(1)))))
            Complex y = rNNp1.multiply(fNm1N).add(one);
            Complex z = rNNp1.add(fNm1N);
            rNm1N = aNm1Sq.multiply(aNm1Sq).multiply(z.divide((y)));
            // Carry over to the next iteration
            rNNp1 = rNm1N;
        }
        modSqrdSpecRef = rNm1N.getReal() * rNm1N.getReal() + rNm1N.getImaginary() * rNm1N.getImaginary();
    }

    return modSqrdSpecRef;
}

From source file:org.renjin.primitives.MathGroup.java

@Builtin
public static ComplexVector cumsum(ComplexVector source) {
    ComplexArrayVector.Builder result = new ComplexArrayVector.Builder(source.length());
    result.setAttribute(Symbols.NAMES, source.getNames());
    Complex sum = ComplexVector.complex(0);
    for (int i = 0; i < source.length(); i++) {
        if (source.isElementNA(i)) {
            break;
        }/*from   w w w.  j a  va  2s .  c o  m*/
        sum = sum.add(source.getElementAsComplex(i));
        result.set(i, sum);
    }
    return result.build();
}

From source file:org.renjin.primitives.Ops.java

@Builtin("+")
@DataParallel(PreserveAttributeStyle.ALL)
public static Complex plus(Complex x, Complex y) {
    return x.add(y);
}

From source file:r.base.Ops.java

@Primitive("+")
@Recycle/*from   w  ww  .j a  v a 2 s . co m*/
@PreserveAttributes(PreserveAttributeStyle.ALL)
public static Complex plus(Complex x, Complex y) {
    return x.add(y);
}

From source file:rb.app.ComplexRBSystem.java

@Override
public double RB_solve(int N) {

    current_N = N;//from w w  w .  j a  va2  s  .c o m

    theta_a = complex_eval_theta_q_a();

    if (N > get_n_basis_functions()) {
        throw new RuntimeException(
                "ERROR: N cannot be larger than the number " + "of basis functions in RB_solve");
    }
    if (N == 0) {
        throw new RuntimeException("ERROR: N must be greater than 0 in RB_solve");
    }

    // Assemble the RB system
    FieldMatrix<Complex> RB_system_matrix_N = new Array2DRowFieldMatrix<Complex>((new Complex(0, 0)).getField(),
            N, N);

    for (int q_a = 0; q_a < get_Q_a(); q_a++) {
        RB_system_matrix_N = RB_system_matrix_N
                .add(RB_A_q_vector[q_a].getSubMatrix(0, N - 1, 0, N - 1).scalarMultiply(theta_a.getEntry(q_a)));
        //            scalarMultiply(complex_eval_theta_q_a(q_a) ) );
    }

    // Assemble the RB rhs
    FieldVector<Complex> RB_rhs_N = new ArrayFieldVector<Complex>(N, new Complex(0d, 0d));

    for (int q_f = 0; q_f < get_Q_f(); q_f++) {
        // Note getSubVector takes an initial index and the number of entries
        // i.e. the interface is a bit different to getSubMatrix
        RB_rhs_N = RB_rhs_N.add(RB_F_q_vector[q_f].getSubVector(0, N).mapMultiply(complex_eval_theta_q_f(q_f)));
    }

    // Solve the linear system by Gaussian elimination

    RB_solution = new ArrayFieldVector<Complex>(N, new Complex(0., 0.));
    for (int j = 1; j < N; j++)
        for (int i = j; i < N; i++) {
            Complex m = RB_system_matrix_N.getEntry(i, j - 1).divide(RB_system_matrix_N.getEntry(j - 1, j - 1));
            for (int k = 0; k < N; k++)
                RB_system_matrix_N.setEntry(i, k, RB_system_matrix_N.getEntry(i, k)
                        .subtract(RB_system_matrix_N.getEntry(j - 1, k).multiply(m)));
            RB_rhs_N.setEntry(i, RB_rhs_N.getEntry(i).subtract(m.multiply(RB_rhs_N.getEntry(j - 1))));
        }
    RB_solution.setEntry(N - 1, RB_rhs_N.getEntry(N - 1).divide(RB_system_matrix_N.getEntry(N - 1, N - 1)));
    for (int j = N - 2; j >= 0; j--) {
        Complex m = new Complex(0., 0.);
        for (int i = j + 1; i < N; i++)
            m = m.add(RB_system_matrix_N.getEntry(j, i).multiply(RB_solution.getEntry(i)));
        RB_solution.setEntry(j, (RB_rhs_N.getEntry(j).subtract(m)).divide(RB_system_matrix_N.getEntry(j, j)));
    }

    // Evaluate the dual norm of the residual for RB_solution_vector
    double epsilon_N = compute_residual_dual_norm(N);

    // Get lower bound for coercivity constant
    double alpha_LB = get_SCM_lower_bound();

    // If SCM lower bound is negative
    if (alpha_LB < 0) { // Get an upper bound instead
        alpha_LB = get_SCM_upper_bound();
    }

    // Store (absolute) error bound
    double abs_error_bound = epsilon_N / residual_scaling_denom(alpha_LB);

    // Compute the norm of RB_solution
    /*
    RealMatrix RB_inner_product_matrix_N =
       RB_inner_product_matrix.getSubMatrix(0, N-1, 0, N-1);
    */

    double RB_solution_norm = 0.0d;
    for (int i = 0; i < N; i++)
        RB_solution_norm += ((RB_solution.getEntry(i)).multiply((RB_solution.getEntry(i)).conjugate()))
                .getReal();
    RB_solution_norm = Math.sqrt(RB_solution_norm);

    // Now compute the outputs and associated errors
    FieldVector<Complex> RB_output_vector_N = new ArrayFieldVector<Complex>(N, new Complex(0d, 0d));
    for (int i = 0; i < get_n_outputs(); i++) {
        RB_outputs[i] = new Complex(0., 0.);

        RB_output_vector_N = (RB_output_vectors[i][0].getSubVector(0, N))
                .mapMultiply(complex_eval_theta_q_l(i, 0));
        for (int q_l = 1; q_l < get_Q_l(i); q_l++)
            RB_output_vector_N = RB_output_vector_N.add(
                    (RB_output_vectors[i][q_l].getSubVector(0, N)).mapMultiply(complex_eval_theta_q_l(i, q_l)));
        for (int j = 0; j < N; j++)
            RB_outputs[i] = RB_outputs[i]
                    .add((RB_output_vector_N.getEntry(j).conjugate()).multiply((RB_solution.getEntry(j))));

        RB_output_error_bounds[i] = new Complex(compute_output_dual_norm(i) * abs_error_bound,
                compute_output_dual_norm(i) * abs_error_bound);
    }

    cal_derived_output();

    return (return_rel_error_bound ? abs_error_bound / RB_solution_norm : abs_error_bound);
}

From source file:rb.app.ComplexRBSystem.java

@Override
public float[][][] get_truth_sol() {
    int N = RB_solution.getDimension();
    float[][][] truth_sol = new float[get_mfield()][3][get_calN()];
    for (int ifn = 0; ifn < get_mfield(); ifn++) {
        Complex tmpval;
        for (int i = 0; i < get_calN(); i++) {
            tmpval = new Complex(0., 0.);
            for (int j = 0; j < N; j++)
                tmpval = tmpval.add(Z_vector[ifn][j][i].multiply(get_complex_soln_coeff(j)));
            truth_sol[ifn][0][i] = (float) tmpval.getReal();
            truth_sol[ifn][1][i] = (float) tmpval.getImaginary();
        }//from   www  .  ja va2s  .  com
        if (get_Q_uL() > 0) {
            for (int q_uL = 0; q_uL < get_Q_uL(); q_uL++)
                for (int i = 0; i < get_calN(); i++) {
                    truth_sol[ifn][0][i] += uL_vector[q_uL][i].getReal();
                    truth_sol[ifn][1][i] += uL_vector[q_uL][i].getImaginary();
                }
        }
        for (int i = 0; i < get_calN(); i++)
            truth_sol[ifn][2][i] = (float) Math.sqrt(
                    truth_sol[ifn][0][i] * truth_sol[ifn][0][i] + truth_sol[ifn][1][i] * truth_sol[ifn][1][i]);
    }
    return truth_sol;
}

From source file:rb.app.ComplexRBSystem.java

@Override
public float[][][] get_sweep_truth_sol() {
    int N = RB_sweep_solution[0][0].length;
    int numSweep = RB_sweep_solution.length;

    Complex[][] RB_sweep_sol = new Complex[numSweep][N];
    for (int i = 0; i < numSweep; i++)
        for (int j = 0; j < N; j++)
            RB_sweep_sol[i][j] = new Complex(RB_sweep_solution[i][0][j], RB_sweep_solution[i][1][j]);

    float[][][] truth_sol = new float[get_mfield()][3][get_calN() * numSweep];
    for (int ifn = 0; ifn < get_mfield(); ifn++) {
        Complex tmpval;
        for (int iSweep = 0; iSweep < numSweep; iSweep++) {
            for (int i = 0; i < get_calN(); i++) {
                tmpval = new Complex(0., 0.);
                for (int j = 0; j < N; j++)
                    tmpval = tmpval.add(Z_vector[ifn][j][i].multiply(RB_sweep_sol[iSweep][j]));
                truth_sol[ifn][0][iSweep * get_calN() + i] = (float) tmpval.getReal();
                truth_sol[ifn][1][iSweep * get_calN() + i] = (float) tmpval.getImaginary();
            }/*www  .  j  a  v a2s.  co  m*/
        }
        if (get_Q_uL() > 0) {
            for (int q_uL = 0; q_uL < get_Q_uL(); q_uL++)
                for (int iSweep = 0; iSweep < numSweep; iSweep++)
                    for (int i = 0; i < get_calN(); i++) {
                        truth_sol[ifn][0][iSweep * get_calN() + i] += uL_vector[q_uL][i].getReal();
                        truth_sol[ifn][1][iSweep * get_calN() + i] += uL_vector[q_uL][i].getImaginary();
                    }
        }
        for (int i = 0; i < get_calN() * numSweep; i++)
            truth_sol[ifn][2][i] = (float) Math.sqrt(
                    truth_sol[ifn][0][i] * truth_sol[ifn][0][i] + truth_sol[ifn][1][i] * truth_sol[ifn][1][i]);
    }
    return truth_sol;
}

From source file:rb.ComplexRBSystem.java

@Override
public double RB_solve(int N) {

    current_N = N;/*w  ww. j av  a 2 s .c o  m*/

    theta_a = complex_eval_theta_q_a();

    if (N > getNBF()) {
        throw new RuntimeException(
                "ERROR: N cannot be larger than the number " + "of basis functions in RB_solve");
    }
    if (N == 0) {
        throw new RuntimeException("ERROR: N must be greater than 0 in RB_solve");
    }

    // Assemble the RB system
    FieldMatrix<Complex> RB_system_matrix_N = new Array2DRowFieldMatrix<Complex>((new Complex(0, 0)).getField(),
            N, N);

    for (int q_a = 0; q_a < getQa(); q_a++) {
        RB_system_matrix_N = RB_system_matrix_N
                .add(RB_A_q_vector[q_a].getSubMatrix(0, N - 1, 0, N - 1).scalarMultiply(theta_a.getEntry(q_a)));
        // scalarMultiply(complex_eval_theta_q_a(q_a) ) );
    }

    // Assemble the RB rhs
    FieldVector<Complex> RB_rhs_N = new ArrayFieldVector<Complex>(N, new Complex(0d, 0d));

    for (int q_f = 0; q_f < getQf(); q_f++) {
        // Note getSubVector takes an initial index and the number of
        // entries
        // i.e. the interface is a bit different to getSubMatrix
        RB_rhs_N = RB_rhs_N.add(RB_F_q_vector[q_f].getSubVector(0, N).mapMultiply(complex_eval_theta_q_f(q_f)));
    }

    // Solve the linear system by Gaussian elimination

    RB_solution = new ArrayFieldVector<Complex>(N, new Complex(0., 0.));
    for (int j = 1; j < N; j++)
        for (int i = j; i < N; i++) {
            Complex m = RB_system_matrix_N.getEntry(i, j - 1).divide(RB_system_matrix_N.getEntry(j - 1, j - 1));
            for (int k = 0; k < N; k++)
                RB_system_matrix_N.setEntry(i, k, RB_system_matrix_N.getEntry(i, k)
                        .subtract(RB_system_matrix_N.getEntry(j - 1, k).multiply(m)));
            RB_rhs_N.setEntry(i, RB_rhs_N.getEntry(i).subtract(m.multiply(RB_rhs_N.getEntry(j - 1))));
        }
    RB_solution.setEntry(N - 1, RB_rhs_N.getEntry(N - 1).divide(RB_system_matrix_N.getEntry(N - 1, N - 1)));
    for (int j = N - 2; j >= 0; j--) {
        Complex m = new Complex(0., 0.);
        for (int i = j + 1; i < N; i++)
            m = m.add(RB_system_matrix_N.getEntry(j, i).multiply(RB_solution.getEntry(i)));
        RB_solution.setEntry(j, (RB_rhs_N.getEntry(j).subtract(m)).divide(RB_system_matrix_N.getEntry(j, j)));
    }

    // Evaluate the dual norm of the residual for RB_solution_vector
    double epsilon_N = compute_residual_dual_norm(N);

    // Get lower bound for coercivity constant
    double alpha_LB = get_SCM_lower_bound();

    // If SCM lower bound is negative
    if (alpha_LB < 0) { // Get an upper bound instead
        alpha_LB = get_SCM_upper_bound();
    }

    // Store (absolute) error bound
    double abs_error_bound = epsilon_N / residual_scaling_denom(alpha_LB);

    // Compute the norm of RB_solution
    /*
     * RealMatrix RB_inner_product_matrix_N =
     * RB_inner_product_matrix.getSubMatrix(0, N-1, 0, N-1);
     */

    double RB_solution_norm = 0.0d;
    for (int i = 0; i < N; i++)
        RB_solution_norm += ((RB_solution.getEntry(i)).multiply((RB_solution.getEntry(i)).conjugate()))
                .getReal();
    RB_solution_norm = Math.sqrt(RB_solution_norm);

    // Now compute the outputs and associated errors
    FieldVector<Complex> RB_output_vector_N = new ArrayFieldVector<Complex>(N, new Complex(0d, 0d));
    for (int i = 0; i < getNumOutputs(); i++) {
        RB_outputs[i] = new Complex(0., 0.);

        RB_output_vector_N = (RB_output_vectors[i][0].getSubVector(0, N))
                .mapMultiply(complex_eval_theta_q_l(i, 0));
        for (int q_l = 1; q_l < getQl(i); q_l++)
            RB_output_vector_N = RB_output_vector_N.add(
                    (RB_output_vectors[i][q_l].getSubVector(0, N)).mapMultiply(complex_eval_theta_q_l(i, q_l)));
        for (int j = 0; j < N; j++)
            RB_outputs[i] = RB_outputs[i]
                    .add((RB_output_vector_N.getEntry(j).conjugate()).multiply((RB_solution.getEntry(j))));

        RB_output_error_bounds[i] = new Complex(compute_output_dual_norm(i, 0) // Zero
                // means
                // no
                // time
                // used
                // here
                * abs_error_bound,
                compute_output_dual_norm(i, 0) // Zero
                        // means
                        // no
                        // time
                        // used
                        // here
                        * abs_error_bound);
    }

    cal_derived_output();

    return (return_rel_error_bound ? abs_error_bound / RB_solution_norm : abs_error_bound);
}