📄 units.c
字号:
/* [b] : Don't simplify units if "unit name" already in symbol table */ hp = NULL; if(d->units_name != (char *) NULL) { hp = lookup(d->units_name); if(hp != NULL) { return(d); } } else return(d); /* [c] : Simplify dimensionless/radians only units */ if( d->length_expnt == 0 && d->time_expnt == 0 && d->mass_expnt == 0 && d->temp_expnt == 0 ) { if(d->radian_expnt == 0) { free((char *)d->units_name); d->units_name = (char *) NULL; d->scale_factor = 1.0; } if(d->radian_expnt == 1) { free((char *) d->units_name); d->units_name = (char *) SaveString("rad"); } return(d); } /* [d] : Simplify LENGTH units alone */ if(d->length_expnt != 0 && d->time_expnt == 0 && d->mass_expnt == 0 && d->temp_expnt == 0 ) { /* Setup default units for length */ if(d->units_type == SI) dp = DefaultUnits("m"); else dp = DefaultUnits("in"); /* Transfer "radians" units to working data structure */ if(d->radian_expnt != 0 ) { dp->radian_expnt = d->radian_expnt; } /* Build working data structures */ if(d->length_expnt == 1) { if(strcmp(d->units_name, dp->units_name) != 0) { free((char *) d->units_name); d->units_name = SaveString(dp->units_name); d->scale_factor = dp->scale_factor; } } else if(d->length_expnt < 0) { d1 = (DIMENSIONS *)MyCalloc(1,sizeof(DIMENSIONS)); ZeroUnits(d1); d1->units_type = d->units_type; if(d->length_expnt == -1) { UnitsDivRep(d, d1, dp, NO); } else { d2 = UnitsPower( dp, ABS(d->length_expnt), NO ); UnitsDivRep(d, d1, d2, NO); free((char *) d2->units_name); free((char *) d2); } free((char *) d1->units_name); free((char *) d1); } else UnitsPowerRep(d, dp, d->length_expnt, NO); free((char *) dp->units_name); free((char *) dp); /* If appropriate, append radian components to units name */ if(d->radian_expnt != 0) { RadUnitsNameExtension( d ); } return(d); } /* [e] : Simplify MASS units alone */ if(d->length_expnt == 0 && d->time_expnt == 0 && d->mass_expnt != 0 && d->temp_expnt == 0 ) { /* Default units for "m" mass */ if(d->units_type == SI) dp = DefaultUnits("kg"); else dp = DefaultUnits("lb"); /* Transfer "radians" units to working data structure */ if(d->radian_expnt != 0 ) { dp->radian_expnt = d->radian_expnt; } /* Build working data structures */ if(d->mass_expnt == 1) { if(strcmp(d->units_name, dp->units_name) != 0) { free((char *) d->units_name); d->units_name = SaveString(dp->units_name); d->scale_factor = dp->scale_factor; } } else if(d->mass_expnt < 0) { d1 = (DIMENSIONS *)MyCalloc(1,sizeof(DIMENSIONS)); ZeroUnits(d1); d1->units_type = d->units_type; if(d->mass_expnt == -1) { UnitsDivRep(d, d1, dp, NO); } else { d2 = UnitsPower( dp, ABS(d->mass_expnt), NO ); UnitsDivRep(d, d1, d2, NO); free((char *) d2->units_name); free((char *) d2); } free((char *) d1->units_name); free((char *) d1); } else UnitsPowerRep(d, dp, d->mass_expnt, NO); free((char *) dp->units_name); free((char *) dp); /* Append radian components to units name */ if(d->radian_expnt != 0) { RadUnitsNameExtension( d ); } return(d); } /* [f] : Simplify TIME units alone */ if(d->length_expnt == 0 && d->time_expnt != 0 && d->mass_expnt == 0 && d->temp_expnt == 0 ) {#ifdef DEBUG printf("In UnitsSimplify() : Start TIME Units\n"); UnitsPrint(d);#endif /* Special cases of "time" and "radians and time" */ if(d->radian_expnt == 0 && d->time_expnt == -1) { free((char *) d->units_name); d->units_name = (char *) SaveString("Hz"); return(d); } if(d->radian_expnt == 1 && d->time_expnt == -1) { free((char *) d->units_name); d->units_name = (char *) SaveString("rad/sec"); return(d); } if(d->radian_expnt == 1 && d->time_expnt == -2) { free((char *) d->units_name); d->units_name = (char *) SaveString("rad/sec^2"); return(d); } /* Build default units and transfer "radians" units */ dp = DefaultUnits("sec"); if(d->radian_expnt != 0 ) { dp->radian_expnt = d->radian_expnt; } /* Build working data structurs */ if(d->time_expnt == 1) { if(strcmp(d->units_name, dp->units_name) != 0) { free((char *) d->units_name); d->units_name = SaveString(dp->units_name); d->scale_factor = dp->scale_factor; } } else if( d->time_expnt < 0 ) { d1 = (DIMENSIONS *)MyCalloc(1,sizeof(DIMENSIONS)); ZeroUnits(d1); d1->units_type = SI_US; if(d->time_expnt == -1) { UnitsDivRep(d, d1, dp, NO); } else { d2 = UnitsPower( dp, ABS(d->time_expnt), NO ); UnitsDivRep(d, d1, d2, NO); free((char *) d2->units_name); free((char *) d2); } free((char *) d1->units_name); free((char *) d1); } else UnitsPowerRep(d, dp, d->time_expnt, NO); free((char *) dp->units_name); free((char *) dp); /* Append radian components to units name */ if(d->radian_expnt != 0) { RadUnitsNameExtension( d ); }#ifdef DEBUG printf("UnitsSimplify() : At the end of TIME Units\n"); UnitsPrint(d); printf("UnitsSimplify() : Leaving TIME Units\n");#endif return(d); } /* [g] : Simplify TEMPERATURE units alone */ if(d->length_expnt == 0 && d->time_expnt == 0 && d->mass_expnt == 0 && d->temp_expnt != 0 ) { /* Build default units */ if(d->units_type == SI) dp = DefaultUnits("deg_C"); else dp = DefaultUnits("deg_F"); /* Transfer "radians" units to working data structure */ if(d->radian_expnt != 0 ) { dp->radian_expnt = d->radian_expnt; } /* Setup working data structures */ if(d->temp_expnt == 1) { if(strcmp(d->units_name, dp->units_name) != 0) { free((char *) d->units_name); d->units_name = SaveString(dp->units_name); d->scale_factor = dp->scale_factor; } } else if(d->temp_expnt < 0) { d1 = (DIMENSIONS *)MyCalloc(1,sizeof(DIMENSIONS)); ZeroUnits(d1); d1->units_type = d->units_type; if(d->temp_expnt == -1) { UnitsDivRep(d, d1, dp, NO); } else { d2 = UnitsPower( dp, ABS(d->temp_expnt), NO ); UnitsDivRep(d, d1, d2, NO); free((char *) d2->units_name); free((char *) d2); } free((char *) d1->units_name); free((char *) d1); } else UnitsPowerRep(d, dp, d->temp_expnt, NO); free((char *) dp->units_name); free((char *) dp); /* Append radian components to units name */ if(d->radian_expnt != 0) { RadUnitsNameExtension( d ); } return(d); } /* [h] : Simplify groups of related units */ /* [h.1] : Simplify LENGTH and MASS related units */ if( d->length_expnt != 0 && d->time_expnt == 0 && d->mass_expnt != 0 && d->temp_expnt == 0 ) { /* Setup default units names */ if(d->units_type == SI) { dp1 = DefaultUnits("m"); dp2 = DefaultUnits("kg"); } else { dp1 = DefaultUnits("in"); dp2 = DefaultUnits("lb"); } /* Transfer "radians" units to working data structure */ if(d->radian_expnt != 0 ) { dp1->radian_expnt = d->radian_expnt; dp2->radian_expnt = d->radian_expnt; } /* Setup working data structures */ if(ABS(d->length_expnt) == 1) { d1 = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS)); UnitsCopy(d1,dp1); } else d1 = UnitsPower( dp1, ABS(d->length_expnt), NO ); if(ABS(d->mass_expnt) == 1) { d2 = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS)); UnitsCopy(d2,dp2); } else d2 = UnitsPower( dp2, ABS(d->mass_expnt), NO ); if(d->length_expnt > 0) { if(d->mass_expnt > 0) UnitsMultRep(d, d1, d2); else UnitsDivRep(d, d1, d2, NO); } else if(d->mass_expnt > 0) { UnitsDivRep(d, d2, d1, NO); } else { dd1 = UnitsPower( dp1, d->length_expnt, NO ); dd2 = UnitsPower( dp2, d->mass_expnt, NO ); UnitsMultRep(d, dd1, dd2); free((char *) dd1->units_name); free((char *) dd1); free((char *) dd2->units_name); free((char *) dd2); } free((char *) d1->units_name); free((char *) d1); free((char *) d2->units_name); free((char *) d2); free((char *) dp1->units_name); free((char *) dp1); free((char *) dp2->units_name); free((char *) dp2); /* Append radian components to units name */ if(d->radian_expnt != 0) { RadUnitsNameExtension( d ); } return(d); } /* [h.2] : Simplify LENGTH and TIME related units */ if( d->length_expnt != 0 && d->time_expnt != 0 && d->mass_expnt == 0 && d->temp_expnt == 0 ) { /* Setup default units */ if(d->units_type == SI) { dp1 = DefaultUnits("m"); dp2 = DefaultUnits("sec"); } else { dp1 = DefaultUnits("in"); dp2 = DefaultUnits("sec"); } /* Transfer "radians" units to working data structure */ if(d->radian_expnt != 0 ) { dp1->radian_expnt = d->radian_expnt; dp2->radian_expnt = d->radian_expnt; } /* Setup working "units" data structures */ if(ABS(d->length_expnt) == 1) { d1 = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS)); UnitsCopy(d1,dp1); } else d1 = UnitsPower( dp1, ABS(d->length_expnt), NO ); if(ABS(d->time_expnt) == 1) { d2 = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS)); UnitsCopy(d2,dp2); } else d2 = UnitsPower( dp2, ABS(d->time_expnt), NO ); if(d->length_expnt > 0) { if(d->time_expnt > 0) UnitsMultRep(d, d1, d2); else UnitsDivRep(d, d1, d2, NO); } else if(d->time_expnt > 0) { UnitsDivRep(d, d2, d1, NO); } else { dd1 = UnitsPower( dp1, d->length_expnt, NO ); dd2 = UnitsPower( dp2, d->time_expnt, NO ); UnitsMultRep(d, dd1, dd2); free((char *) dd1->units_name); free((char *) dd1); free((char *) dd2->units_name); free((char *) dd2); } free((char *) d1->units_name); free((char *) d1); free((char *) d2->units_name); free((char *) d2); free((char *) dp1->units_name); free((char *) dp1); free((char *) dp2->units_name); free((char *) dp2); /* If appropriate, append radian components to units name */ if(d->radian_expnt != 0) { RadUnitsNameExtension( d ); } return(d); } /* [h.3] : Simplify LENGTH and TEMPERATURE related units */ if( d->length_expnt != 0 && d->time_expnt == 0 && d->mass_expnt == 0 && d->temp_expnt != 0 ) { /* Build default units */ if(d->units_type == SI) { dp1 = DefaultUnits("m"); dp2 = DefaultUnits("deg_C"); } else { dp1 = DefaultUnits("in"); dp2 = DefaultUnits("deg_F"); } /* Transfer "radians" units to working data structure */ if(d->radian_expnt != 0 ) { dp1->radian_expnt = d->radian_expnt; dp2->radian_expnt = d->radian_expnt; } /* Setup working "units" data structures */ if(ABS(d->length_expnt) == 1) { d1 = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS)); UnitsCopy(d1,dp1); } else d1 = UnitsPower( dp1, ABS(d->length_expnt), NO ); if(ABS(d->temp_expnt) == 1) { d2 = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS)); UnitsCopy(d2,dp2); } else d2 = UnitsPower( dp2, ABS(d->temp_expnt), NO ); if(d->length_expnt > 0) { if(d->temp_expnt > 0) UnitsMultRep(d, d1, d2); else UnitsDivRep(d, d1, d2, NO);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -