00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 static const char docstring[] =
00011 "rotate: rotates the sun for a given number of hours (new version)\n"
00012 "\n"
00013 " y=rotate(x,geom1,geom2,hours,mode,bb);\n"
00014 " * Given a solar image x with pose given by geom1, rotate it backward\n"
00015 " in time by hours hours, into the pose given by geom2. Off-disk and\n"
00016 " unknown values are indicated by NaN.\n"
00017 " * The differential rotation coefficients are defined by this routine.\n"
00018 " The rotation speed depends on latitude, according to:\n"
00019 " omega = coefs(1) + coefs(2) * S + coefs(3) * S^2\n"
00020 " where S = [sin(latitude)]^2, and omega is the apparent\n"
00021 " angular velocity in degrees/day. The equator rotates fastest,\n"
00022 " but this is not assumed in the code.\n"
00023 " * We use obs_v = 0.9865 deg/day and coefs = [14.6,-2.2,0] deg/day.\n"
00024 " * The required mode parameter selects two things, sesw or transposed\n"
00025 " pixel ordering, and also full vs. sparse rotation. These work\n"
00026 " as follows.\n"
00027 " * The normal HMI (and normal MDI) pixel ordering starts in the\n"
00028 " southeast corner, and the first scan line of pixels runs toward the\n"
00029 " southwest corner. This is `sesw' ordering. The transposed ordering\n"
00030 " is `sene'; this ordering is what we used for the JPL MDI processing.\n"
00031 " In particular, the older rotate routine uses the transposed ordering.\n"
00032 " This is implemented via internal stride parameters.\n"
00033 " * The regular full-image rotation looks at every pixel in the\n"
00034 " target image and interpolates a value for each. Or, a 'sparse'\n"
00035 " algorithm can be specified when the rotated input x is mostly zero,\n"
00036 " as for example indicators of active regions. This method does\n"
00037 " a pre-scan of x to determine where the nonzero values are, and\n"
00038 " only computes y in a box bounding the one where x will move to,\n"
00039 " not over the whole disk. It thus saves computation depending on\n"
00040 " the extent of the nonzeros in x (more compact is better).\n"
00041 " * If the bounding box of nonzeros in x is known, it can be given\n"
00042 " as the last argument and that region will be used to restrict the\n"
00043 " pre-scan of x.\n"
00044 " * When mode contains `sparse', uncomputed values are left as zero\n"
00045 " outside this box. Such zero values can be known, on-disk values\n"
00046 " that happen to be zero, or off-disk value, or values that would be\n"
00047 " unknown. In short, no distinction is made between 0 and NaN as\n"
00048 " opposed to when mode contains `full'. But in particular, all\n"
00049 " non-zero, non-NaN values will match up.\n"
00050 "\n"
00051 " Inputs:\n"
00052 " real x(m,n);\n"
00053 " real geom1(5); -- [center_x center_y r_sun beta p0]\n"
00054 " opt real geom2(5) = geom1; -- (empty defaults to above)\n"
00055 " real hours;\n"
00056 " char mode = 'full,sesw' -- required, in: {full,sparse}x{sesw,sene}\n"
00057 " opt int bb = [1 1 m n] -- matlab coordinates\n"
00058 "\n"
00059 " Outputs:\n"
00060 " real y(m,n);\n"
00061 "\n"
00062 " See also:\n"
00063 "\n"
00064 " implemented as a mex file\n"
00065 " turmon rewrote (again) Sept 2010\n"
00066 "";
00067
00068
00069