Home > . > setinternal.m

setinternal

PURPOSE ^

SETINTERNAL - set the internal angles for makelist

SYNOPSIS ^

function internal = setinternal(mode, preInternal, varargin)

DESCRIPTION ^

 SETINTERNAL - set the internal angles for makelist

 internal = setinternal(mode, preInternal)
   internal drawn from file and cannot be 'OPTIMAL'
 internal = setinternal(mode, preInternal, nSim)
   internal can be 'OPTIMAL'

 mode      operating mode of makelist
 preInternal  intermediate internal angles 
 nSim      (optional) number of angles to generate

 internal  determined internal angles

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function internal = setinternal(mode, preInternal, varargin)
0002 
0003 % SETINTERNAL - set the internal angles for makelist
0004 %
0005 % internal = setinternal(mode, preInternal)
0006 %   internal drawn from file and cannot be 'OPTIMAL'
0007 % internal = setinternal(mode, preInternal, nSim)
0008 %   internal can be 'OPTIMAL'
0009 %
0010 % mode      operating mode of makelist
0011 % preInternal  intermediate internal angles
0012 % nSim      (optional) number of angles to generate
0013 %
0014 % internal  determined internal angles
0015 
0016 % $Id: setinternal.m,v 1.2 2004/05/10 20:26:14 stuver Exp $
0017 
0018 % DETERMINE how internal angles where input to makelist from mode
0019 % IF internal angles were read from file
0020 %   DETERMINE if makelist needs to set angles
0021 %   IF angle needs to be set
0022 %       SET angle
0023 %   ELSEIF angle does not need to be set
0024 %       TYPECAST from string to double
0025 %   ENDIF
0026 %   RETURN determined internal angles
0027 % ELSEIF internal angles were not read from a file
0028 %   DETERMINE class of internal
0029 %   IF string
0030 %       SET angles either randomly or to optimal orientation
0031 %   ELSEIF double
0032 %       COPY internal nSim times
0033 %   ELSEIF struct
0034 %       COPY inernal nSim times
0035 %   ENDIF
0036 %   RETURN determined internal angles
0037 % ENDIF
0038 
0039 internal = [];
0040 
0041 % If internal was read from a file
0042 if mode == 1 | mode == 2 | mode == 3 | mode == 4
0043     % There are 2 types of internal angles that need to be looked at
0044     % individually.
0045     % Each of these angle types may be a list.  Each angle on the list must
0046     % be looked at individually.
0047     
0048     % Sort internal into the two angle types
0049     [int1, int2] = deal(preInternal{1}, preInternal{2});
0050 
0051     % Look at every angle in each angle type
0052     for k = 1:size(int1, 1)     
0053         % Examine int1
0054         if strcmp(upper(int1(k,:)), 'RANDOM') | ...
0055             strcmp(upper(int1(k,:)), 'RANDOM ')
0056             % Set first internal angle randomly
0057             tempInt1(k,1) = randomangle(1, 'x');
0058         elseif strcmp(upper(int1(k,:)), 'OPTIMAL')
0059             % Optimize first internal angle
0060             tempInt1(k,1) = 1;
0061         else
0062             % Typecast first internal angle
0063             tempInt1(k,1) = str2double(int1(k,:));
0064             % Check for error
0065             if isnan(tempInt1(k,1))
0066                 int1 = int1(k,:)
0067                 error('makelist -> setinternal: Error reading int1')
0068             end
0069         end 
0070         % Examine int2
0071         if strcmp(upper(int2(k,:)), 'RANDOM') | ...
0072             strcmp(upper(int2(k,:)), 'RANDOM ')
0073             % Set second internal angle randomly
0074             tempInt2(k,1) = randomangle(1, 'phi');
0075         elseif strcmp(upper(int2(k,:)), 'OPTIMAL')
0076             % Optimize second internal angle
0077             tempInt2(k,1) = 0;
0078         else
0079             % Typecase second internal angle
0080             tempInt2(k,1) = str2double(int2(k,:)); 
0081             % Check for error
0082             if isnan(tempInt2(k,1))
0083                 int2 = int2(k,:)
0084                 error('makelist -> setinternal: Error reading int2')
0085             end
0086         end
0087     end
0088     % Return determined internal angles
0089     internal = [tempInt1, tempInt2];
0090     
0091 % If internal was not read from a file
0092 elseif mode == 5 | mode == 6
0093     
0094     % Set nSim from varargin
0095     if length(varargin) >= 1
0096         nSim = varargin{1};
0097     else
0098         error(['makelist -> setinternal: Need to know number of '...
0099                 'internal angles to generate (nSim)'])
0100     end
0101     
0102     if strcmp(class(preInternal), 'char') % internal is a string
0103         if strcmp(upper(preInternal), 'RANDOM')
0104             % Set all (int1 & int2) internal angles randomly nSim times
0105             internal = [randomangle(nSim, 'x'), randomangle(nSim, 'phi')];
0106             % Return determined internal angles
0107         elseif strcmp(upper(preInternal), 'OPTIMAL')
0108             % Generate nSim optimized internal angles
0109             internal = repmat([1, 0], nSim, 1);
0110             % Return determined internal angles
0111         else
0112             internal = preInternal
0113             error(['makelist -> setinternal: internal must be 1x2 vector '...
0114                     'or string ''RANDOM'' or ''OPTIMAL'''])
0115         end
0116     elseif strcmp(class(preInternal), 'double') % internal is a double
0117         % Copy internal angles nSim times
0118         internal = repmat(preInternal, nSim, 1);
0119         % Return determined internal angles
0120     elseif strcmp(class(preInternal), 'struct') % internal is a struct
0121         if ~isfield(preInternal, 'x') | ~isfield(preInternal, 'phi')
0122             internal = preInternal
0123             error(['makelist -> setinternal: The internal struct must '...
0124                     'have fields x and phi'])
0125         end
0126         % Copy internal angles nSim times
0127         internal = repmat([preInternal.x, preInternal.phi], nSim, 1);
0128         % Return determined internal angles
0129     else 
0130         internal = preInternal
0131         error(['makelist -> setinternal: Class type of internal must ' ...
0132                 'be double, struct or char'])
0133     end
0134     
0135 end
0136 
0137 % Check ranges on the angles
0138 check = find(abs(internal(:,1)) > 1);
0139 if ~isempty(check)
0140     int1 = internal(:,1)
0141     error(['makelist -> setinternal: The first internal angle is out of ' ...
0142             'range: (-1 1)'])
0143 end
0144 
0145 check = find(internal(:,2) < -pi | internal(:,2) > pi);
0146 if ~isempty(check)
0147     int2 = internal(:,2)
0148     error(['makelist -> setinternal: The second internal angle is out of '...
0149         'range: (-pi pi)'])
0150 end
0151     
0152 return

Generated on Tue 05-Oct-2004 10:40:50 by m2html © 2003