00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
#include "kernel-rfpulse.h"
00036
00045 void KernelPulse(
EXPERIENCE3D * expr,
EVENT * event)
00046 {
00047
double w1,
x, y, z, dw,edw, alpha, beta, delta, sb, cb, sd, cd;
00048
double antx, anty, antz, p1, p2, p3, p5, p6, p9;
00049
double r1x, r2x, tau;
00050
double r1y, r2y, r1z, r2z;
00051
int ix, iy, iz, it, n;
00052
int xmin;
00053
int xmax;
00054
00055
#ifdef HAVE_MPI
00056
if (expr->mpi_slice_x0 == -1) {
00057 xmin = 0;
00058 xmax = expr->
nfovx;
00059 }
else {
00060 xmin=expr->mpi_slice_x0;
00061 xmax=xmin+mpi_get_slice_width(expr, xmin);
00062 }
00063
#else
00064
xmin = 0;
00065 xmax = expr->
nfovx;
00066
#endif
00067
00068
00069
if (event->
pulse_duration && event->
ang) {
00070 r1x =
G * event->
agx;
00071 r2x = expr->
xf + expr->
obx - event->
agxoff;
00072 r1y =
G * event->
agy;
00073 r2y = expr->
yf + expr->
oby - event->
agyoff;
00074 r1z =
G * event->
agz;
00075 r2z = expr->
zf + expr->
obz - event->
agzoff;
00076
00077
00078 n = 1;
00079 alpha = event->
ang;
00080 tau = event->
pulse_duration;
00081 w1 = alpha / tau;
00082
00083
for (it = 0; it < n; it++)
00084
for (ix = xmin; ix < xmax; ix++)
00085
for (iy = expr->
nfovy - 1; iy >= 0; iy--)
00086
for (iz = expr->
nfovz - 1; iz >= 0; iz--) {
00087 antx = expr->
magstate[0][ix][iy][iz];
00088 anty = expr->
magstate[1][ix][iy][iz];
00089 antz = expr->
magstate[2][ix][iy][iz];
00090
x = expr->
px * ix - r2x;
00091 y = expr->
py * iy - r2y;
00092 z = expr->
pz * iz - r2z;
00093
00094
if (expr->
FLAG_RESONANCE==
ON)
00095 {
00096 dw =
G_rad_T*(event->
agx*
x + event->
agy*y + event->
agz*z);
00097 }
00098
else
00099 {
00100 edw = expr->
G_edw *(expr->
B0+1.*(event->
agx*
x + event->
agy*y + event->
agz*z) + expr->
G_deche[ix][iy][iz]);
00101 dw =
G_rad_T*(event->
agx*
x + event->
agy*y + event->
agz*z + expr->
G_deche[ix][iy][iz]) - edw;
00102 }
00103
00104 beta = -atan2(dw, w1);
00105 delta = -tau * sqrt(dw * dw + w1 * w1);
00106 sb = sin(beta);
00107 cb = cos(beta);
00108 sd = sin(delta);
00109 cd = cos(delta);
00110
00111 p5 = cd--;
00112 p1 = 1 + sb * sb * cd;
00113 p2 = sb * sd;
00114 p3 = cb * sb * cd;
00115 p6 = -cb * sd;
00116 p9 = 1 + cb * cb * cd;
00117 expr->
magstate[0][ix][iy][iz] =
00118 p1 * antx + p2 * anty + p3 * antz;
00119 expr->
magstate[1][ix][iy][iz] =
00120 -p2 * antx + p5 * anty + p6 * antz;
00121 expr->
magstate[2][ix][iy][iz] =
00122 p3 * antx - p6 * anty + p9 * antz;
00123 }
00124
00125 expr->
to = expr->
to + tau;
00126
if (alpha > M_PI/2) expr->
to =expr->
to * -1;
00127 }
00128 }