krb5_error_code KRB5_CALLCONV krb5_get_profile (krb5_context ctx, profile_t *profile) { return profile_copy (ctx->profile, profile); }
void model_profile(model *m, profile *p) { int layer, repeat_start, R, R_start, R_end, R_count; profile_reset(p); /* Insert vacuum layers */ if (!profile_extend(p,1)) return; profile_slice(p,10.,m->rho[0],m->mu[0] #ifdef HAVE_MAGNETIC ,m->P[0],m->theta[0] #endif ); add_interface_left(m,p,0,1); p->vacuum_offset = profile_depth(p); /* vacuum interface thickness */ /* initialize R_start, R_end, R_count */ model_repeat(m,R=0,&R_start,&R_end,&R_count); repeat_start = -1; for (layer=1; layer<m->n-1; layer++) { /* Remember where the repeat section starts */ if (layer == R_start+1) repeat_start = p->n; /* Check if we need to repeat */ if (layer == R_end) { /* The interface between repeats is different from the * interface into the first repeat and out of the last * repeat. So instead of repeating R1 R2 R3 R4 as in: * Ln|R1 R2 R3 R4|R1 R2 R3 R4|R1 R2 R3 R4|Ln+1 * we have to repeat R2 R3 R1 as in: * Ln R1*|R2 R3 R4 R1|R2 R3 R4 R1|R2 R3 R4* Ln+1 * with the last repeat only extending from R_start+1 to * R_end-1. * * At this point we have: * Ln R1*|R2 R3 * so we need to add R4 and R1 to complete the repeating * section, then copy that section R_count-2 times (first * repeat is done, last repeat is special), then copy * what we have of the last repeat, leaving us at: * Ln R1* R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 * and layer == R4, so continue as normal. */ int r, repeat_length, repeat_interface; repeat_interface = p->n; /* add interface between repeating sections */ add_layer(m,p,R_end-1,R_end,R_start); add_layer(m,p,R_end,R_start,R_start+1); /* do bulk repeats of R_start+1 to R_start */ assert(repeat_start > 0); repeat_length = p->n - repeat_start; profile_extend(p,R_count*repeat_length); /* make sure there is room */ for (r=1; r < R_count-1; r++) profile_copy(p, repeat_start, repeat_length); /* copy layers from R_start to I_start */ profile_copy(p, repeat_start, repeat_interface-repeat_start); /* Look for next repeat */ model_repeat(m,++R,&R_start,&R_end,&R_count); repeat_start = -1; } add_layer(m,p,layer-1,layer,layer+1); } /* Insert substrate layers */ add_interface_right(m,p,layer-1,layer); if (!profile_extend(p,1)) return; profile_slice(p,10.,m->rho[layer],m->mu[layer] #ifdef HAVE_MAGNETIC ,m->P[layer],m->theta[layer] #endif ); /* Convert polar to cartesian for magnetic layers */ profile_expth(p); }