33submodule(
mma) mma_device
35 use device_math,
only: device_copy, device_cmult, device_cadd, device_cfill, &
36 device_add2, device_add3s2, device_invcol2, device_col2, device_col3, &
37 device_sub2, device_sub3
47 use neko_config,
only: neko_bcknd_device
48 use device,
only: device_to_host
49 use comm,
only: pe_rank
50 use mpi_f08,
only: mpi_in_place
56 module subroutine mma_update_device(this, iter, x, df0dx, fval, dfdx)
64 class(mma_t),
intent(inout) :: this
65 integer,
intent(in) :: iter
66 real(kind=rp),
dimension(this%n),
intent(inout) :: x
68 type(vector_t) :: df0dx, fval, xdesign
69 type(matrix_t) :: dfdx
71 if (.not. this%is_initialized)
then
72 write(stderr, *)
"The MMA object is not initialized."
77 call xdesign%init(this%n)
78 call device_memcpy(x, xdesign%x_d, this%n, host_to_device, sync = .false.)
81 call mma_gensub_device(this, iter, xdesign, df0dx, fval, dfdx)
83 call mma_subsolve_dpip_device(this, xdesign)
85 call device_memcpy(x, xdesign%x_d, this%n, device_to_host, sync = .false.)
87 this%is_updated = .true.
88 end subroutine mma_update_device
90 module subroutine mma_kkt_device(this, x, df0dx, fval, dfdx)
91 class(mma_t),
intent(inout) :: this
92 real(kind=rp),
dimension(this%n),
intent(in) :: x
93 type(vector_t),
intent(in) :: fval, df0dx
94 type(matrix_t),
intent(in) :: dfdx
96 type(vector_t) :: designx
97 real(kind=rp) :: rez, rezeta
98 type(vector_t) :: rey, relambda, remu, res
99 type(vector_t) :: rex, rexsi, reeta
100 real(kind=rp) :: residu_val
102 real(kind=rp) :: re_xstuff_squ_global
103 real(kind=rp) :: globaltemp_norm
106 call designx%init(this%n)
108 call device_memcpy(designx%x, designx%x_d, this%n, host_to_device, &
112 call rey%init(this%m)
113 call relambda%init(this%m)
114 call remu%init(this%m)
115 call res%init(this%m)
117 call rex%init(this%n)
118 call rexsi%init(this%n)
119 call reeta%init(this%n)
122 this%eta%x_d, this%lambda%x_d, this%n, this%m)
125 call device_col3(rey%x_d, this%d%x_d, this%y%x_d, this%m)
126 call device_add2(rey%x_d, this%c%x_d, this%m)
127 call device_sub2(rey%x_d, this%lambda%x_d, this%m)
128 call device_sub2(rey%x_d, this%mu%x_d, this%m)
130 rez = this%a0 - this%zeta -
device_lcsc2(this%lambda%x_d, this%a%x_d, &
133 call device_add3s2(relambda%x_d, fval%x_d, this%a%x_d, 1.0_rp, -this%z, &
135 call device_sub2(relambda%x_d, this%y%x_d, this%m)
136 call device_add2(relambda%x_d, this%s%x_d, this%m)
139 call device_sub3(rexsi%x_d, designx%x_d, this%xmin%x_d, this%n)
140 call device_col2(rexsi%x_d, this%xsi%x_d, this%n)
142 call device_sub3(reeta%x_d, this%xmax%x_d, designx%x_d, this%n)
143 call device_col2(reeta%x_d, this%eta%x_d, this%n)
145 call device_col3(remu%x_d, this%mu%x_d, this%y%x_d, this%m)
147 rezeta = this%zeta*this%z
149 call device_col3(res%x_d, this%lambda%x_d, this%s%x_d, this%m)
158 call mpi_allreduce(residu_val, this%residumax, 1, &
159 mpi_real_precision, mpi_max, neko_comm, ierr)
163 call mpi_allreduce(globaltemp_norm, re_xstuff_squ_global, 1, &
164 mpi_real_precision, mpi_sum, neko_comm, ierr)
165 this%residunorm = sqrt(
device_norm(rey%x_d, this%m) + rez**2 + &
167 rezeta**2+
device_norm(res%x_d, this%m) + re_xstuff_squ_global)
168 end subroutine mma_kkt_device
174 subroutine mma_gensub_device(this, iter, x, df0dx, fval, dfdx)
180 class(mma_t),
intent(inout) :: this
181 type(vector_t),
intent(in) :: x
182 type(vector_t),
intent(in) :: df0dx
183 type(vector_t),
intent(in) :: fval
184 type(matrix_t),
intent(in) :: dfdx
186 integer,
intent(in) :: iter
188 type(vector_t) :: globaltmp_m
192 call globaltmp_m%init(this%m)
193 if (iter .lt. 3)
then
194 call device_add3s2(this%low%x_d, this%xmax%x_d, this%xmin%x_d, &
195 - this%asyinit, this%asyinit, this%n)
196 call device_add2(this%low%x_d, x%x_d, this%n)
198 call device_add3s2( this%upp%x_d, this%xmax%x_d, this%xmin%x_d, &
199 this%asyinit, - this%asyinit, this%n)
200 call device_add2(this%upp%x_d, x%x_d, this%n)
203 this%xold1%x_d, this%xold2%x_d, this%xmin%x_d, this%xmax%x_d, &
204 this%asydecr, this%asyincr, this%n)
206 call device_memcpy(this%upp%x, this%upp%x_d, this%n, device_to_host, &
208 call device_memcpy(this%low%x, this%low%x_d, this%n, device_to_host, &
211 this%upp%x_d, this%xmin%x_d, this%xmax%x_d, this%alpha%x_d, &
212 this%beta%x_d, this%p0j%x_d, this%q0j%x_d, this%pij%x_d, &
213 this%qij%x_d, this%n, this%m)
215 call device_memcpy(this%alpha%x, this%alpha%x_d, this%n, device_to_host, &
217 call device_memcpy(this%beta%x, this%beta%x_d, this%n, device_to_host, &
223 this%qij%x_d, this%n, this%m, this%bi%x_d)
224 call device_memcpy(this%pij%x, this%pij%x_d, this%n*this%m, &
225 device_to_host, sync = .true.)
226 call device_memcpy(this%qij%x, this%qij%x_d, this%n*this%m, &
227 device_to_host, sync = .true.)
230 globaltmp_m%x = 0.0_rp
231 call device_memcpy(this%bi%x, this%bi%x_d, this%m, device_to_host, &
233 call mpi_allreduce(this%bi%x, globaltmp_m%x, this%m, mpi_real_precision, &
234 mpi_sum, neko_comm, ierr)
235 call device_memcpy(globaltmp_m%x, globaltmp_m%x_d, this%m, &
236 host_to_device, sync = .true.)
237 call device_sub3(this%bi%x_d, globaltmp_m%x_d, fval%x_d, this%m)
239 call device_memcpy(this%bi%x, this%bi%x_d, this%m, device_to_host, &
242 call globaltmp_m%free()
243 end subroutine mma_gensub_device
246 subroutine mma_subsolve_dpip_device(this, designx)
247 class(mma_t),
intent(inout) :: this
248 type(vector_t),
intent(in) :: designx
249 integer :: iter, itto, ierr
250 real(kind=rp) :: epsi, residumax, residunorm, z, zeta, rez, rezeta, &
251 delz, dz, dzeta, steg, dummy_one, zold, zetaold, newresidu
253 type(vector_t) :: y, lambda, s, mu, rey, relambda, remu, res, &
254 dely, dellambda, dy, dlambda, ds, dmu, yold, lambdaold, sold, muold
255 type(vector_t) :: globaltmp_m
258 type(vector_t) :: x, xsi, eta, rex, rexsi, reeta, &
259 delx, diagx, dx, dxsi, deta, xold, xsiold, etaold
264 type(matrix_t) :: globaltmp_mm
267 integer,
dimension(this%m+1) :: ipiv
268 real(kind=rp) :: re_xstuff_squ_global
270 integer :: nglobal, i
272 real(kind=rp) :: cons
273 real(kind=rp) :: minimal_epsilon
276 call globaltmp_m%init(this%m)
277 call globaltmp_mm%init(this%m, this%m)
281 call lambda%init(this%m)
284 call rey%init(this%m)
285 call relambda%init(this%m)
286 call remu%init(this%m)
287 call res%init(this%m)
288 call dely%init(this%m)
289 call dellambda%init(this%m)
291 call dlambda%init(this%m)
293 call dmu%init(this%m)
294 call yold%init(this%m)
295 call lambdaold%init(this%m)
296 call sold%init(this%m)
297 call muold%init(this%m)
299 call xsi%init(this%n)
300 call eta%init(this%n)
301 call rex%init(this%n)
302 call rexsi%init(this%n)
303 call reeta%init(this%n)
304 call delx%init(this%n)
305 call diagx%init(this%n)
307 call dxsi%init(this%n)
308 call deta%init(this%n)
309 call xold%init(this%n)
310 call xsiold%init(this%n)
311 call etaold%init(this%n)
312 call bb%init(this%m+1)
314 call gg%init(this%m, this%n)
315 call aa%init(this%m+1, this%m+1)
322 call device_add3s2(x%x_d, this%alpha%x_d, this%beta%x_d, 0.5_rp, 0.5_rp, &
324 call device_cfill(y%x_d, 1.0_rp, this%m)
327 call device_cfill(lambda%x_d, 1.0_rp, this%m)
328 call device_cfill(s%x_d, 1.0_rp, this%m)
331 call device_max2(mu%x_d, 1.0_rp, this%c%x_d, 0.5_rp, this%m)
332 call device_memcpy(xsi%x, xsi%x_d, this%n, device_to_host, sync = .true.)
333 call device_memcpy(eta%x, eta%x_d, this%n, device_to_host, sync = .true.)
334 call device_memcpy(mu%x, mu%x_d, this%m, device_to_host, sync = .true.)
336 call mpi_allreduce(this%n, nglobal, 1, mpi_integer, mpi_sum, &
342 minimal_epsilon = max(0.9_rp * this%epsimin, 1.0e-12_rp)
343 call mpi_allreduce(mpi_in_place, minimal_epsilon, 1, &
344 mpi_real_precision, mpi_min, neko_comm, ierr)
349 outer:
do while (epsi .gt. minimal_epsilon)
353 associate(p0j => this%p0j, q0j => this%q0j, &
354 pij => this%pij, qij => this%qij, &
355 low => this%low, upp => this%upp, &
356 alpha => this%alpha, beta => this%beta, &
357 c => this%c, d => this%d, &
358 a0 => this%a0, a => this%a, &
361 call device_rex(rex%x_d, x%x_d, low%x_d, upp%x_d, &
362 pij%x_d, p0j%x_d, qij%x_d, q0j%x_d, &
363 lambda%x_d, xsi%x_d, eta%x_d, this%n, this%m)
365 call device_col3(rey%x_d, d%x_d, y%x_d, this%m)
366 call device_add2(rey%x_d, c%x_d, this%m)
367 call device_sub2(rey%x_d, lambda%x_d, this%m)
368 call device_sub2(rey%x_d, mu%x_d, this%m)
369 rez = a0 - zeta -
device_lcsc2(lambda%x_d, a%x_d, this%m)
370 call device_cfill(relambda%x_d, 0.0_rp, this%m)
372 low%x_d, pij%x_d, qij%x_d, this%n, this%m)
373 call device_memcpy(relambda%x, relambda%x_d, this%m, device_to_host, &
378 globaltmp_m%x = 0.0_rp
379 call mpi_allreduce(relambda%x, globaltmp_m%x, this%m, &
380 mpi_real_precision, mpi_sum, neko_comm, ierr)
382 call device_memcpy(globaltmp_m%x, globaltmp_m%x_d, this%m, &
383 host_to_device, sync = .true.)
384 call device_add3s2(relambda%x_d, globaltmp_m%x_d, this%a%x_d, &
386 call device_sub2(relambda%x_d, y%x_d, this%m)
387 call device_add2(relambda%x_d, s%x_d, this%m)
388 call device_sub2(relambda%x_d, this%bi%x_d, this%m)
390 call device_sub3(rexsi%x_d, x%x_d, this%alpha%x_d, this%n)
391 call device_col2(rexsi%x_d, xsi%x_d, this%n)
392 call device_cadd(rexsi%x_d, -epsi, this%n)
394 call device_sub3(reeta%x_d, this%beta%x_d, x%x_d, this%n)
395 call device_col2(reeta%x_d, eta%x_d, this%n)
396 call device_cadd(reeta%x_d, -epsi, this%n)
398 call device_col3(remu%x_d, mu%x_d, y%x_d, this%m)
399 call device_cadd(remu%x_d, -epsi, this%m)
401 rezeta = zeta*z -epsi
403 call device_col3(res%x_d, lambda%x_d, s%x_d, this%m)
404 call device_cadd(res%x_d, -epsi, this%m)
415 call mpi_allreduce(cons, residumax, 1, mpi_real_precision, mpi_max, &
418 re_xstuff_squ_global = 0.0_rp
421 call mpi_allreduce(cons, re_xstuff_squ_global, 1, &
422 mpi_real_precision, mpi_sum, neko_comm, ierr)
427 residunorm = sqrt(cons + re_xstuff_squ_global)
431 do iter = 1, this%max_iter
433 if (residumax .lt. epsi)
exit
435 call device_delx(delx%x_d, x%x_d, this%low%x_d, this%upp%x_d, &
436 this%pij%x_d, this%qij%x_d, this%p0j%x_d, this%q0j%x_d, &
437 this%alpha%x_d, this%beta%x_d, lambda%x_d, epsi, this%n, &
440 call device_col3(dely%x_d, this%d%x_d, y%x_d, this%m)
441 call device_add2(dely%x_d, this%c%x_d, this%m)
442 call device_sub2(dely%x_d, lambda%x_d, this%m)
444 delz = this%a0 -
device_lcsc2(lambda%x_d, this%a%x_d, this%m) - &
446 call device_cfill(dellambda%x_d, 0.0_rp, this%m)
448 this%low%x_d, this%pij%x_d, this%qij%x_d, this%n, this%m)
449 call device_memcpy(dellambda%x, dellambda%x_d, this%m, &
450 device_to_host, sync = .true.)
452 globaltmp_m%x = 0.0_rp
453 call mpi_allreduce(dellambda%x, globaltmp_m%x, this%m, &
454 mpi_real_precision, mpi_sum, neko_comm, ierr)
456 call device_memcpy(globaltmp_m%x, globaltmp_m%x_d, this%m, &
457 host_to_device, sync = .true.)
458 call device_add3s2(dellambda%x_d, globaltmp_m%x_d, this%a%x_d, &
461 call device_sub2(dellambda%x_d, y%x_d, this%m)
462 call device_sub2(dellambda%x_d, this%bi%x_d, this%m)
465 call device_gg(gg%x_d, x%x_d, this%low%x_d, this%upp%x_d, &
466 this%pij%x_d, this%qij%x_d, this%n, this%m)
468 call device_diagx(diagx%x_d, x%x_d, xsi%x_d, this%low%x_d, &
469 this%upp%x_d, this%p0j%x_d, this%q0j%x_d, this%pij%x_d, &
470 this%qij%x_d, this%alpha%x_d, this%beta%x_d, eta%x_d, &
471 lambda%x_d, this%n, this%m)
473 call device_bb(bb%x_d, gg%x_d, delx%x_d, diagx%x_d, this%n, &
475 call device_memcpy(bb%x, bb%x_d, this%m, device_to_host, &
478 call mpi_allreduce(mpi_in_place, bb%x(1:this%m), this%m, &
479 mpi_real_precision, mpi_sum, neko_comm, ierr)
481 call device_memcpy(bb%x, bb%x_d, this%m, &
482 host_to_device, sync = .true.)
485 this%d%x_d, mu%x_d, y%x_d, delz, this%m)
487 call device_cfill(aa%x_d, 0.0_rp, (this%m+1) * (this%m+1) )
488 call device_aa(aa%x_d, gg%x_d, diagx%x_d, this%n, this%m)
489 call device_memcpy(aa%x, aa%x_d, (this%m+1) * (this%m+1), &
490 device_to_host, sync = .true.)
491 call mpi_allreduce(mpi_in_place, aa%x(1:this%m, 1:this%m), &
492 this%m * this%m, mpi_real_precision, mpi_sum, neko_comm, ierr)
493 call device_memcpy(aa%x, aa%x_d, &
494 (this%m) * (this%m), host_to_device, sync = .true.)
496 call device_memcpy(lambda%x, lambda%x_d, this%m, device_to_host, &
498 call device_memcpy(mu%x, mu%x_d, this%m, device_to_host, &
500 call device_memcpy(y%x, y%x_d, this%m, device_to_host, &
502 call device_memcpy(s%x, s%x_d, this%m, device_to_host, &
506 aa%x(i, i) = aa%x(i, i) &
507 + s%x(i) / lambda%x(i) &
508 + 1.0_rp / (this%d%x(i) + mu%x(i) / y%x(i))
510 aa%x(1:this%m, this%m+1) = this%a%x
511 aa%x(this%m+1, 1:this%m) = this%a%x
512 aa%x(this%m+1, this%m+1) = - zeta/z
516 call device_memcpy(bb%x, bb%x_d, this%m+1, device_to_host, &
518 call dgesv(this%m+1, 1, aa%x, this%m+1, ipiv, bb%x, this%m+1, &
520 if (info .ne. 0)
then
521 write(stderr, *)
"DGESV failed in mma_device.f90."
522 write(stderr, *)
"Please check mma_subsolve_dpip in mma.f90"
525 call device_memcpy(bb%x, bb%x_d, this%m+1, host_to_device, &
528 call device_copy(dlambda%x_d, bb%x_d, this%m)
529 dz = bb%x(this%m + 1)
531 call device_dx(dx%x_d, delx%x_d, diagx%x_d, gg%x_d, &
532 dlambda%x_d, this%n, this%m)
533 call device_dy(dy%x_d, dely%x_d, dlambda%x_d, this%d%x_d, &
534 mu%x_d, y%x_d, this%m)
535 call device_dxsi(dxsi%x_d, xsi%x_d, dx%x_d, x%x_d, &
536 this%alpha%x_d, epsi, this%n)
537 call device_deta(deta%x_d, eta%x_d, dx%x_d, x%x_d, &
538 this%beta%x_d, epsi, this%n)
543 call device_col3(dmu%x_d, mu%x_d, dy%x_d, this%m)
544 call device_cmult(dmu%x_d, -1.0_rp, this%m)
545 call device_cadd(dmu%x_d, epsi, this%m)
546 call device_invcol2(dmu%x_d, y%x_d, this%m)
547 call device_sub2(dmu%x_d, mu%x_d, this%m)
549 dzeta = -zeta + (epsi-zeta*dz)/z
550 call device_col3(ds%x_d, dlambda%x_d, s%x_d, this%m)
551 call device_cmult(ds%x_d, -1.0_rp, this%m)
552 call device_cadd(ds%x_d, epsi, this%m)
553 call device_invcol2(ds%x_d, lambda%x_d, this%m)
554 call device_sub2(ds%x_d, s%x_d, this%m)
558 -1.01_rp, this%m), -1.01_rp*dz/z, &
567 1.01_rp, this%n), -1.01_rp*dzeta/zeta])
571 call mpi_allreduce(steg, steg, 1, &
572 mpi_real_precision, mpi_min, neko_comm, ierr)
575 call device_copy(xold%x_d, x%x_d, this%n)
576 call device_copy(yold%x_d, y%x_d, this%m)
578 call device_copy(lambdaold%x_d, lambda%x_d, this%m)
579 call device_copy(xsiold%x_d, xsi%x_d, this%n)
580 call device_copy(etaold%x_d, eta%x_d, this%n)
581 call device_copy(muold%x_d, mu%x_d, this%m)
583 call device_copy(sold%x_d, s%x_d, this%m)
584 newresidu = 2.0*residunorm
589 do while ((newresidu .gt. residunorm) .and. (itto .lt. 50))
591 call device_add3s2(x%x_d, xold%x_d, dx%x_d, 1.0_rp, &
593 call device_add3s2(y%x_d, yold%x_d, dy%x_d, 1.0_rp, &
596 call device_add3s2(lambda%x_d, lambdaold%x_d, &
597 dlambda%x_d, 1.0_rp, steg, this%m)
599 call device_add3s2(xsi%x_d, xsiold%x_d, dxsi%x_d, &
600 1.0_rp, steg, this%n)
601 call device_add3s2(eta%x_d, etaold%x_d, deta%x_d, &
602 1.0_rp, steg, this%n)
604 call device_add3s2(mu%x_d, muold%x_d, dmu%x_d, &
605 1.0_rp, steg, this%m)
607 zeta = zetaold + steg*dzeta
609 call device_add3s2(s%x_d, sold%x_d, ds%x_d, 1.0_rp, &
614 call device_rex(rex%x_d, x%x_d, this%low%x_d, &
615 this%upp%x_d, this%pij%x_d, this%p0j%x_d, &
616 this%qij%x_d, this%q0j%x_d, lambda%x_d, xsi%x_d, &
617 eta%x_d, this%n, this%m)
619 call device_memcpy(rex%x, rex%x_d, this%n, device_to_host, &
621 call device_memcpy(xsi%x, xsi%x_d, this%n, device_to_host, &
623 call device_memcpy(eta%x, eta%x_d, this%n, device_to_host, &
625 call device_memcpy(lambda%x, lambda%x_d, this%m, &
626 device_to_host, sync = .true.)
630 call device_col3(rey%x_d, this%d%x_d, y%x_d, this%m)
631 call device_add2(rey%x_d, this%c%x_d, this%m)
632 call device_sub2(rey%x_d, lambda%x_d, this%m)
633 call device_sub2(rey%x_d, mu%x_d, this%m)
638 call device_cfill(relambda%x_d, 0.0_rp, this%m)
640 this%low%x_d, this%pij%x_d, this%qij%x_d, &
642 call device_memcpy(relambda%x, relambda%x_d, this%m, &
643 device_to_host, sync = .true.)
645 globaltmp_m%x = 0.0_rp
646 call mpi_allreduce(relambda%x, globaltmp_m%x, this%m, &
647 mpi_real_precision, mpi_sum, neko_comm, ierr)
649 call device_memcpy(globaltmp_m%x, globaltmp_m%x_d, &
650 this%m, host_to_device, sync = .true.)
654 call device_add3s2(relambda%x_d, globaltmp_m%x_d, &
655 this%a%x_d, 1.0_rp, -z, this%m)
656 call device_sub2(relambda%x_d, y%x_d, this%m)
657 call device_add2(relambda%x_d, s%x_d, this%m)
658 call device_sub2(relambda%x_d, this%bi%x_d, this%m)
661 call device_sub3(rexsi%x_d, x%x_d, this%alpha%x_d, this%n)
662 call device_col2(rexsi%x_d, xsi%x_d, this%n)
663 call device_cadd(rexsi%x_d, -epsi, this%n)
665 call device_sub3(reeta%x_d, this%beta%x_d, x%x_d, this%n)
666 call device_col2(reeta%x_d, eta%x_d, this%n)
667 call device_cadd(reeta%x_d, -epsi, this%n)
669 call device_col3(remu%x_d, mu%x_d, y%x_d, this%m)
670 call device_cadd(remu%x_d, -epsi, this%m)
672 rezeta = zeta*z - epsi
675 call device_col3(res%x_d, lambda%x_d, s%x_d, this%m)
676 call device_cadd(res%x_d, -epsi, this%m)
678 re_xstuff_squ_global = 0.0_rp
682 call mpi_allreduce(cons, re_xstuff_squ_global, 1, &
683 mpi_real_precision, mpi_sum, neko_comm, ierr)
690 newresidu = sqrt(cons+ re_xstuff_squ_global)
703 residunorm = newresidu
705 call mpi_allreduce(cons, residumax, 1, mpi_real_precision, &
706 mpi_max, neko_comm, ierr)
713 call device_copy(this%xold2%x_d, this%xold1%x_d, this%n)
714 call device_copy(this%xold1%x_d, designx%x_d, this%n)
715 call device_copy(designx%x_d, x%x_d, this%n)
718 call device_copy(this%y%x_d, y%x_d, this%m)
720 call device_copy(this%lambda%x_d, lambda%x_d, this%m)
722 call device_copy(this%xsi%x_d, xsi%x_d, this%n)
723 call device_copy(this%eta%x_d, eta%x_d, this%n)
724 call device_copy(this%mu%x_d, mu%x_d, this%m)
725 call device_copy(this%s%x_d, s%x_d, this%m)
727 end subroutine mma_subsolve_dpip_device
731end submodule mma_device
subroutine, public device_dx(dx_d, delx_d, diagx_d, gg_d, dlambda_d, n, m)
subroutine, public device_relambda(relambda_d, x_d, upp_d, low_d, pij_d, qij_d, n, m)
real(kind=rp) function, public device_maxval2(dxx_d, xx_d, cons, n)
subroutine, public device_delx(delx_d, x_d, low_d, upp_d, pij_d, qij_d, p0j_d, q0j_d, alpha_d, beta_d, lambda_d, epsi, n, m)
subroutine, public device_mma_gensub4(x_d, low_d, upp_d, pij_d, qij_d, n, m, bi_d)
subroutine, public device_deta(deta_d, eta_d, dx_d, x_d, beta_d, epsi, n)
subroutine, public device_rex(rex_d, x_d, low_d, upp_d, pij_d, p0j_d, qij_d, q0j_d, lambda_d, xsi_d, eta_d, n, m)
real(kind=rp) function, public device_maxval3(dx_d, x_d, alpha_d, cons, n)
subroutine, public device_diagx(diagx_d, x_d, xsi_d, low_d, upp_d, p0j_d, q0j_d, pij_d, qij_d, alpha_d, beta_d, eta_d, lambda_d, n, m)
subroutine, public device_mma_gensub3(x_d, df0dx_d, dfdx_d, low_d, upp_d, min_d, max_d, alpha_d, beta_d, p0j_d, q0j_d, pij_d, qij_d, n, m)
real(kind=rp) function, public device_norm(rex_d, n)
subroutine, public device_mma_max(xsi_d, x_d, alpha_d, n)
subroutine, public device_bb(bb_d, gg_d, delx_d, diagx_d, n, m)
subroutine, public device_dxsi(dxsi_d, xsi_d, dx_d, x_d, alpha_d, epsi, n)
subroutine, public device_mma_gensub2(low_d, upp_d, x_d, xold1_d, xold2_d, xmin_d, xmax_d, asydecr, asyincr, n)
subroutine, public device_updatebb(bb_d, dellambda_d, dely_d, d_d, mu_d, y_d, delz, m)
subroutine, public device_updateaa(aa_d, globaltmp_mm_d, s_d, lambda_d, d_d, mu_d, y_d, a_d, zeta, z, m)
real(kind=rp) function, public device_maxval(rex_d, n)
subroutine, public device_aa(aa_d, gg_d, diagx_d, n, m)
subroutine, public device_kkt_rex(rex_d, df0dx_d, dfdx_d, xsi_d, eta_d, lambda_d, n, m)
real(kind=rp) function, public device_lcsc2(a_d, b_d, n)
subroutine, public device_dy(dy_d, dely_d, dlambda_d, d_d, mu_d, y_d, n)
subroutine, public device_gg(gg_d, x_d, low_d, upp_d, pij_d, qij_d, n, m)
subroutine, public device_add2inv2(a_d, b_d, c, n)
subroutine, public device_max2(a_d, b, c_d, d, n)