106{
107
108 integer a_dim1, a_offset, i__1, i__2;
110
112 extern
113 int sscal_(
integer *,
real *,
real *,
integer *), slarf_(
char *,
integer *,
integer *,
real *,
integer *,
real *,
real *,
integer *,
real *), xerbla_(
char *,
integer *);
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 a_dim1 = *lda;
135 a_offset = 1 + a_dim1;
136 a -= a_offset;
137 --tau;
138 --work;
139
140 *info = 0;
141 if (*m < 0)
142 {
143 *info = -1;
144 }
145 else if (*n < 0 || *n > *m)
146 {
147 *info = -2;
148 }
149 else if (*k < 0 || *k > *n)
150 {
151 *info = -3;
152 }
153 else if (*lda < max(1,*m))
154 {
155 *info = -5;
156 }
157 if (*info != 0)
158 {
159 i__1 = -(*info);
160 xerbla_("SORG2R", &i__1);
161 return 0;
162 }
163
164 if (*n <= 0)
165 {
166 return 0;
167 }
168
169 i__1 = *n;
170 for (j = *k + 1;
171 j <= i__1;
172 ++j)
173 {
174 i__2 = *m;
175 for (l = 1;
176 l <= i__2;
177 ++l)
178 {
179 a[l + j * a_dim1] = 0.f;
180
181 }
182 a[j + j * a_dim1] = 1.f;
183
184 }
185 for (i__ = *k;
186 i__ >= 1;
187 --i__)
188 {
189
190 if (i__ < *n)
191 {
192 a[i__ + i__ * a_dim1] = 1.f;
193 i__1 = *m - i__ + 1;
194 i__2 = *n - i__;
195 slarf_("Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1]);
196 }
197 if (i__ < *m)
198 {
199 i__1 = *m - i__;
200 r__1 = -tau[i__];
201 sscal_(&i__1, &r__1, &a[i__ + 1 + i__ * a_dim1], &c__1);
202 }
203 a[i__ + i__ * a_dim1] = 1.f - tau[i__];
204
205 i__1 = i__ - 1;
206 for (l = 1;
207 l <= i__1;
208 ++l)
209 {
210 a[l + i__ * a_dim1] = 0.f;
211
212 }
213
214 }
215 return 0;
216
217}
int integer
Definition FLA_f2c.h:25
float real
Definition FLA_f2c.h:30