00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef FUNCTIONS_H
00017 #define FUNCTIONS_H
00018
00019 int acpp_main(int argc, char* argv[]);
00020 void append_if_necessary (char* str, char c);
00021 void apply_external_forces(MotionData* inv_data);
00022 void apply_joint_restraint_torques(SDModelStruct* sdm, double state[]);
00023 void apply_muscle_forces(SDModelStruct* sdm);
00024 void assign_muscle_states(SDModelStruct* sdm, double time, double state[]);
00025 double calc_active_force(MuscleStruct* ms, double norm_fiber_length);
00026 double calc_distance_between_points(double p1[], int n1, double p2[], int n2);
00027 double calc_excitation(MuscleStruct* ms, double time, double state[]);
00028 double calc_fiber_force(MuscleStruct* ms, double activation,
00029 double norm_fiber_length, double norm_fiber_velocity);
00030 double calc_fiber_velocity(MuscleStruct* ms, double activation,
00031 double active_force, double velocity_dependent_force);
00032 double calc_force_velocity(MuscleStruct* ms, double norm_fiber_velocity);
00033 int calc_line_intersect_cylinder (
00034 double p11[3],
00035 double p22[3],
00036 double p0[3],
00037 double dn[3],
00038 double r,
00039 double* rlen,
00040 double r1[],
00041 double r2[],
00042 double** wrap_pts,
00043 int* num_wrap_pts,
00044 int wrap_axis,
00045 int wrap_sign,
00046 WrapStruct* mwrap,
00047 int* p_flag,
00048 WrapObject* wo);
00049 int calc_line_intersect_ellipsoid (
00050 double p1[3],
00051 double p2[3],
00052 double m[3],
00053 double a[3],
00054 double* rlen,
00055 double r1[],
00056 double r2[],
00057 double** wrap_pts,
00058 int* num_wrap_pts,
00059 int wrap_axis,
00060 int wrap_sign,
00061 WrapStruct* mwrap,
00062 int* p_flag,
00063 WrapObject* wo);
00064 int calc_line_intersect_sphere(double p1[], double p2[], double m[],
00065 double r, double *rlen, double r1[],
00066 double r2[],
00067 double** wrap_pts, int *num_wrap_pts,
00068 int wrap_axis, int wrap_sign, WrapStruct* mwrap,
00069 int *p_flag,
00070 WrapObject* wo);
00071 void calc_muscle_power(MuscleStruct* ms);
00072 void calc_muscle_tendon_force(MuscleStruct* ms, double activation);
00073 double calc_muscle_tendon_length(MuscleStruct* ms);
00074 double calc_muscle_tendon_velocity(MuscleStruct* ms);
00075 double calc_nonzero_passive_force(MuscleStruct* ms, double norm_fiber_length,
00076 double norm_fiber_velocity);
00077 double calc_passive_force(MuscleStruct* ms, double norm_fiber_length,
00078 double norm_fiber_velocity);
00079 double calc_pennation(double fiber_length, double optimal_fiber_length,
00080 double initial_pennation_angle);
00081 void calc_system_energy(SystemInfo* si);
00082 double calc_tendon_force(MuscleStruct* ms, double norm_tendon_length);
00083 void check_object_info(void);
00084 void check_wrapping_points(MuscleStruct* ms, double state[]);
00085 char* clean_string(char buf[]);
00086 void convert_point(double pt[], int frame1, int frame2);
00087 void convert_string(char str[]);
00088 int count_muscle_states(SDModelStruct* sdm);
00089 int enter_gencoord(SDModelStruct* sdm, char gencoord_name[]);
00090 int enter_segment(SDModelStruct* sdm, char segment_name[]);
00091 void error(ErrorAction action, char str_buffer[]);
00092 double get_muscle_param_value(MuscleStruct* ms, char param_name[]);
00093 ReturnCode get_string_pair(char str_buffer[], char str1[], char str2[]);
00094 char* get_temp_file_name(const char* baseFileName);
00095 WrapObject* get_wrap_object(char name[]);
00096 ReturnCode get_xypair_from_string(char str_buffer[], double* x, double* y);
00097 void init_joint_functions(void);
00098 void init_muscle_states(SDModelStruct* sdm, double state[]);
00099 void init_object_info(void);
00100 void init_q_restraint_functions(void);
00101 void init_qs(void);
00102 void init_segments(void);
00103 void integrate(void (*func)(), double *time, double st[], double dst[], double param[],
00104 double dt, double *step, int neqin, double tol, double work[], int *err, int *which);
00105 void invert_3x3matrix(double matrix[][3], double inverse[][3]);
00106 void invert_4x4matrix(double matrix[][4], double inverse[][4]);
00107 void invert_4x4transform(double matrix[][4], double inverse[][4]);
00108 void invert_matrix(double* matrix[], double* inverse[], int size);
00109 SBoolean is_absolute_path(char *path);
00110 ReturnCode load_kinetics_data(SDModelStruct* sdm, MotionData* data, char filename[],
00111 SBoolean verify_data);
00112 ReturnCode malloc_function(SplineFunction* func, int numpoints);
00113 void message(char message_str[]);
00114 ReturnCode mstrcpy(char* dest_str[], char original_str[]);
00115 char* parse_string(char str_buffer[], VariableType var_type,
00116 void* dest_var);
00117 FILE* preprocess_file(char infile[], char outfile[]);
00118 void prescribe_inverse_dynamics(SDModelStruct* sdm, MotionData* inv_data, int frame);
00119 void print_3x3matrix(double mat[][3], char string[], FILE* stream);
00120 void read_contact_pair(FILE** fp);
00121 ReturnCode read_double_array(FILE **fp, char ending[], char name[],
00122 SplineFunction* func);
00123 int read_line(FILE** fp, char str_buffer[]);
00124 MusclePoint* read_muscle_attachment_points(FILE** fp, SDModelStruct* sdm,
00125 int* numpoints, int* mp_array_size,
00126 SBoolean* has_wrapping_points);
00127 ReturnCode read_muscle_file(SDModelStruct* sdm, char filename[]);
00128 ReturnCode read_muscle_groups(FILE** fp);
00129 int read_nonempty_line(FILE** fp, char str_buffer[]);
00130 void read_object(FILE** fp);
00131 void read_object_group(FILE** fp);
00132 ReturnCode read_parameters_file(char params_file[], SDModelStruct* sdm,
00133 char** muscle_file, char** kinetics_file,
00134 char** output_motion_file, char** output_kinetics_file);
00135 ReturnCode read_polyhedron(PolyhedronStruct* ph, char filename[]);
00136 int read_string(FILE** fp, char str_buffer[]);
00137 ReturnCode realloc_function(SplineFunction* func, int size);
00138 int sduforce(double t, double q[], double u[]);
00139 int sdumotion(double t, double q[], double u[]);
00140 void set_data_frame(SDModelStruct* sdm, MotionData* inv_data, double q[],
00141 double u[], int frame);
00142 void set_fixed_gencoords(SDModelStruct* sdm);
00143 void set_prescribed_gencoords(double t, double q[], double u[],
00144 SDModelStruct* sdm, MotionData* kinetics_data);
00145 void set_prescribed_motion(SDModelStruct* sdm, QType type, int value);
00146 FILE* simm_fopen (const char* name, const char* mode);
00147 void* simm_malloc(unsigned mem_size);
00148 void* simm_calloc(unsigned num_elements, unsigned elem_size);
00149 void* simm_realloc(void* ptr, unsigned mem_size, ReturnCode* rc);
00150 ReturnCode verify_assembly(SDModelStruct* sdm, double state[]);
00151 void write_data(SDModelStruct* sdm, MotionData* inv_data, FILE** fp);
00152
00153
00154
00155
00156 int muscle_init_func1(MuscleStruct *ms, double state[]);
00157 int muscle_init_func2(MuscleStruct *ms, double state[]);
00158 int muscle_init_func3(MuscleStruct *ms, double state[]);
00159 int muscle_init_func4(MuscleStruct *ms, double state[]);
00160 int muscle_init_func5(MuscleStruct *ms, double state[]);
00161 int muscle_init_func6(MuscleStruct *ms, double state[]);
00162 int muscle_init_func7(MuscleStruct *ms, double state[]);
00163 int muscle_init_func8(MuscleStruct *ms, double state[]);
00164 int muscle_init_func9(MuscleStruct *ms, double state[]);
00165 int muscle_init_func10(MuscleStruct *ms, double state[]);
00166
00167
00168 int muscle_deriv_func1(double time, MuscleStruct *ms, double state[],
00169 double dstate[], double *muscle_force);
00170 int muscle_deriv_func2(double time, MuscleStruct *ms, double state[],
00171 double dstate[], double *muscle_force);
00172 int muscle_deriv_func3(double time, MuscleStruct *ms, double state[],
00173 double dstate[], double *muscle_force);
00174 int muscle_deriv_func4(double time, MuscleStruct *ms, double state[],
00175 double dstate[], double *muscle_force);
00176 int muscle_deriv_func5(double time, MuscleStruct *ms, double state[],
00177 double dstate[], double *muscle_force);
00178 int muscle_deriv_func6(double time, MuscleStruct *ms, double state[],
00179 double dstate[], double *muscle_force);
00180 int muscle_deriv_func7(double time, MuscleStruct *ms, double state[],
00181 double dstate[], double *muscle_force);
00182 int muscle_deriv_func8(double time, MuscleStruct *ms, double state[],
00183 double dstate[], double *muscle_force);
00184 int muscle_deriv_func9(double time, MuscleStruct *ms, double state[],
00185 double dstate[], double *muscle_force);
00186 int muscle_deriv_func10(double time, MuscleStruct *ms, double state[],
00187 double dstate[], double *muscle_force);
00188
00189
00190 int muscle_assign_func1(double time, MuscleStruct *ms, double state[]);
00191 int muscle_assign_func2(double time, MuscleStruct *ms, double state[]);
00192 int muscle_assign_func3(double time, MuscleStruct *ms, double state[]);
00193 int muscle_assign_func4(double time, MuscleStruct *ms, double state[]);
00194 int muscle_assign_func5(double time, MuscleStruct *ms, double state[]);
00195 int muscle_assign_func6(double time, MuscleStruct *ms, double state[]);
00196 int muscle_assign_func7(double time, MuscleStruct *ms, double state[]);
00197 int muscle_assign_func8(double time, MuscleStruct *ms, double state[]);
00198 int muscle_assign_func9(double time, MuscleStruct *ms, double state[]);
00199 int muscle_assign_func10(double time, MuscleStruct *ms, double state[]);
00200
00201
00202 int check_for_sderror(char caller[]);
00203 void convert_point2(int frame1, double p1[], int frame2, double p2[]);
00204 void init_joints(void);
00205
00206
00207 void ludcmp(double* a[], int n, int indx[], double* d);
00208 void lubksb(double* a[], int n, int indx[], double b[]);
00209
00210
00211 #if CONTACT_DETECTION
00212 void compute_contact_forces(int impact_flag);
00213 #endif
00214
00215
00216 #if CONTACT_DETECTION
00217 int find_impact(double *t, double y[], double dy[], double t_final,
00218 double *work, double param[], int *status);
00219 void handle_impacts(double t, double y[], double dy[]);
00220 #endif
00221
00222
00223 #if CONTACT_DETECTION
00224 void apply_forces_at_contacts(int n, ContactInfo list[]);
00225 void check_for_initial_penetration(FILE **out, double y[], double dy[]);
00226 void copy_cnode(ContactInfo from, ContactInfo *to);
00227 void create_bilateral_contacts(double y[]);
00228 void determine_contacts(double y[], double dy[]);
00229 void get_bilat_contact_info(void);
00230 void get_contact_info(void);
00231 double get_norm_rel_vel(int i, double vn[]);
00232 double get_rel_vel(int cont, double rel_vel[]);
00233 double get_tang_rel_vel(int i, double vt[]);
00234 void init_contact_info(void);
00235 ReturnCode makepaths(void);
00236 void print_contact_list(ContactInfo list[], int n);
00237 #endif
00238
00239
00240 void calc_muscle_derivatives(double time, double state[], double dstate[],
00241 double param[], int* status);
00242
00243
00244 void calc_derivatives(double t, double y[], double dy[], double param[], int *status);
00245
00246
00247 void get_reaction_forces(void);
00248 double get_time_now(void);
00249 void print_body_info(void);
00250 void print_final_information(int step, int num_steps, double t, double y[], double dy[], SystemInfo* si);
00251 void print_simulation_info(int interval, double time, double state[], SystemInfo* si);
00252 void print_state(double y[], double dy[]);
00253 void set_up_motion_file(FILE **fp, char filename[], int num_steps, double step_size);
00254 void write_motion_frame(int interval, double time, double state[],
00255 FILE **fp);
00256 void show_array(char name[], double vect[], int start, int end);
00257 void show_array_as_matrix(char name[], double vec[], int n, int m);
00258 void show_matrix(char name[], double *mat[], int m, int n);
00259 void show_vector(char name[], double vect[]);
00260 void time_elapsed(double t_in, double t_out);
00261
00262
00263 void copy_polyhedron(PolyhedronStruct* from, PolyhedronStruct* to);
00264 void show_object_info(void);
00265
00266
00267 void check_spring_info(void);
00268 void apply_spring_forces(SDModelStruct *sdm);
00269 void show_spring_info(void);
00270
00271
00272 #endif